.net - 服务定位器 - 值得吗?

标签 .net design-patterns service-locator

我们有一个大型解决方案(> 100 个项目),几乎每种类型都使用服务定位器(示例 1)或我们自己的类型字典(示例 2)进行实例化。

例如我们有:

IQuote quote = Registry.Resolve<IQuote>(); 

或者
IQuote quote = Registry.Find<IQuote>(args);

第二个示例转到配置文件以查找要使用反射实例化的具体对象。

跟踪代码时会变得更加困难——因为不清楚使用的是什么具体类型——所以我们必须多次检查映射,因为我们试图学习代码的一部分。以上述为例,按 F12 键:quote.DoSomething()将带您进入接口(interface)定义。

实现起来也有点困难——我们需要一个接口(interface) + 具体类 + 配置映射,而替代方案只有 1 个类。

想一想——我不知道有任何东西被“换掉”为另一种类型——所以虽然我们已经实现了 IoC,但我们没有使用它,或者至少——很少使用它。

所以 - 它真的值得吗?我们是否错误地/太多地实现了它?我是不是误会了什么?

最佳答案

你们使用的是服务定位器这被认为是一种反模式,
因为:

  • 所有单元测试都必须使用 服务定位器 (涉及 DI 号 DI 容器 )
  • 您将整个架构耦合到服务定位器(在 DI 中,只有 Composition Root 使用 DI 容器 )
  • 您无法立即看到组件的依赖关系( DI 构造函数注入(inject) )
  • 您的单元测试变得更加复杂,因为您必须关心您的配置,以免其他测试错误地使用另一个配置(Tear Down)。

  • http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

    关于.net - 服务定位器 - 值得吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11283595/

    相关文章:

    c# - 如何避免服务定位器反模式?

    symfony - Silex - 真正的 DI 与注入(inject) $app(看起来像 ServiceLocator)?

    java - 使用服务定位器模式时如何使用模拟进行测试?

    .net - GC.Collect 与否?

    c# - 当用户尝试打开一个新实例时返回到一个已经打开的应用程序

    c# - 在业务对象和 DTO 之间共享内容

    c++ - 为什么有些方法属于主题/观察者接口(interface),而另一些方法属于主题/观察者具体子类?

    java - 过滤和丰富对象的模式

    c# - 为什么我不能用三元运算符给小数赋值?

    .net - 在 .Net 中保持 Powershell 运行空间打开