0

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

我发现了 Common Service Locator,它为包括 Ninject 在内的任何 IOC 容器提供了服务定位器模式。它在我的“启动”项目中效果很好——例如网站。但是,如果我尝试从子项目(例如 Core 或 Data)访问 ServiceLocator.Current,那么 CommonServiceLocator 似乎不知道我的任何依赖关系映射。

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

注意我知道关于 ServiceLocator 作为模式/反模式的辩论。我发现在作为反模式的 ServiceLocator 和作为反模式的贫血域模型之间存在权衡 -有时使用服务定位器更容易且可维护。

4

2 回答 2

4

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

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

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

于 2012-02-19T18:30:36.367 回答
0

Without entering the debate on the use of a service locator, have you tried this NuGet Package CommonServiceLocator.NinjectAdapter?

When I decide I want one, this is what I've used.

于 2012-02-20T14:54:33.273 回答