Ninject contextual bindinng like structuremap

时间:2013-05-11 19:31:57

标签: c# dependency-injection ninject ioc-container ninject-2

您好我正在使用Ninject IoC容器。我无法将结构图代码转换为ninject。

这是结构图代码绑定

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 个答案:

答案 0 :(得分:1)

我建议您将IProductCatalogService的一些实现注入到CachedProductCatalogService中,它还实现IProductCatalogService,然后在应用程序的其余部分中使用此缓存的实现作为默认组件。< / p>

使用Ninject,您可以使用.WhenParentNamed条件绑定对其进行配置,如下所示:

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

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

当有IProductCatalogService ninject的请求时,将尝试解决这些问题。如果父组件(要求注入)名为"cached"(在您的情况下为CachedProductCatalogService),则ninject将返回ProductCatalogService,否则将返回{ {1}}为默认值。