使用主项目外的公共服务定位器

时间:2012-02-19 13:21:35

标签: dependency-injection inversion-of-control ninject structuremap common-service-locator

我最近从StructureMap跳到了Ninject。一切顺利,直到我意识到Ninject没有版本的StructureMap的ObjectFactory(服务定位器)。

我发现了Common Service Locator,它为服务定位器模式提供了包含Ninject的任何IOC容器。它在我的“启动”项目中运行良好 - 例如网站。但是,如果我尝试从子项目访问ServiceLocator.Current,例如核心或数据似乎CommonServiceLocator不知道我的任何依赖映射。

如何使用子项目中的Common Service Locator?

N.B。我知道有关ServiceLocator作为模式/反模式的争论。我发现ServiceLocator作为反模式和Anemic Domain Model作为反模式之间存在权衡 - 有时它更容易和更简单。可维护使用服务定位器。

2 个答案:

答案 0 :(得分:4)

使用factories而不是直接访问容器。这使您的应用程序不受特定容器的影响,并阻止使用服务定位器。

您必须访问内核的唯一情况是在组合根目录中,并且在一些非常罕见的情况下,您无法控制对象创建。在这些情况下,您仍然可以将内核分配给单个对象,或使用ServiceLocator使其可以从任何地方访问。

ServiceLocator是一个静态对象。因此,与您访问它的位置没有区别。我假设您在完全配置之前访问ServiceLocator。

答案 1 :(得分:0)

在没有讨论使用服务定位器的情况下,您是否尝试过这个NuGet包CommonServiceLocator.NinjectAdapter

当我决定要一个时,这就是我用过的。