【问题标题】:Using Common Service Locator outside Main Project在主项目外使用公共服务定位器
【发布时间】:2012-03-10 02:34:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • > 有时使用服务定位器更容易和可维护。我不能说我完全同意该声明,但无论如何......你有任何代码显示你如何设置 NInject 定位器适配器?
  • 无缘无故引入 CSL,因为你想忽略关于 SL 的建议并不会改变你正在寻找一种方法来做 SL 的事实,因此我的 VTC

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    没有进入关于使用服务定位器的辩论,你有没有尝试过这个 NuGet 包CommonServiceLocator.NinjectAdapter

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

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2017-08-22
      相关资源
      最近更新 更多