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
по умолчанию.