我最近从StructureMap跳到了Ninject。一切顺利,直到我意识到Ninject没有版本的StructureMap的ObjectFactory(服务定位器)。
我发现了Common Service Locator,它为服务定位器模式提供了包含Ninject的任何IOC容器。它在我的“启动”项目中运行良好 - 例如网站。但是,如果我尝试从子项目访问ServiceLocator.Current,例如核心或数据似乎CommonServiceLocator不知道我的任何依赖映射。
如何使用子项目中的Common Service Locator?
N.B。我知道有关ServiceLocator作为模式/反模式的争论。我发现ServiceLocator作为反模式和Anemic Domain Model作为反模式之间存在权衡 - 有时它更容易和更简单。可维护使用服务定位器。
答案 0 :(得分:4)
使用factories而不是直接访问容器。这使您的应用程序不受特定容器的影响,并阻止使用服务定位器。
您必须访问内核的唯一情况是在组合根目录中,并且在一些非常罕见的情况下,您无法控制对象创建。在这些情况下,您仍然可以将内核分配给单个对象,或使用ServiceLocator使其可以从任何地方访问。
ServiceLocator是一个静态对象。因此,与您访问它的位置没有区别。我假设您在完全配置之前访问ServiceLocator。
答案 1 :(得分:0)
在没有讨论使用服务定位器的情况下,您是否尝试过这个NuGet包CommonServiceLocator.NinjectAdapter?
当我决定要一个时,这就是我用过的。