Ninject контекстное связывание, как структура карты

Привет я использую контейнер Ninject IoC. Я не могу преобразовать код структуры карты в ninject.

Это привязка кода Structuremap

For<IProductCatalogService>().Use<ProductCatalogService>().Named("realProductCatalogService");
For<IProductCatalogService>().Use<CachedProductCatalogService>()
                  .Ctor<IProductCatalogService>().Is(p => p.TheInstanceNamed("realProductCatalogService"));

И я использую код Ninject, как это

Kernel.Bind<IProductCatalogService>().To<ProductCatalogService>().Named("realProductCatalogService");
Kernel.Bind<IProductCatalogService>().To<CachedProductCatalogService>().Named("cachedProductCatalogService");

Но это не работает.

1 ответ

Я предлагаю вам внедрить некоторую реализацию IProductCatalogService в CachedProductCatalogService, который также реализует IProductCatalogService а затем использовать эту кэшированную реализацию в остальной части приложения в качестве компонента по умолчанию.

С Ninject вы можете настроить его, используя .WhenParentNamed условное связывание вот так:

Kernel.Bind<IProductCatalogService>()
      .To<ProductCatalogService>()
      .WhenParentNamed("cached");

Kernel.Bind<IProductCatalogService>()
      .To<CachedProductCatalogService>()
      .Named("cached");

Когда есть запрос на IProductCatalogService ninject попытается решить условия. Если родительский компонент (который запросил инъекцию) называется "cached" (CachedProductCatalogService в вашем случае) чем нинжект вернется ProductCatalogService в противном случае он вернется CachedProductCatalogService по умолчанию.

Другие вопросы по тегам