为什么MVC4使用服务定位器反模式?

Tom*_*kel 46 dependency-injection ioc-container service-locator asp.net-mvc-4

在阅读Mark Seemann的".NET中的依赖注入"后,我远离服务定位器,这是一种反模式.

在阅读MVC 4上的发行说明后,我看到:

通过DependencyResolver改进了控制反转(IoC):Web API现在使用MVC依赖解析器实现的服务定位器模式来获取许多不同设施的实例.

因此,我对于微软在2012年使用服务定位器的原因感到好奇和困惑.

Dar*_*rov 50

这是一个你不应该关心的实现细节.重要的是,现在Web API使用DependencyResolver来解决许多不同设施的依赖关系,只要您想插入这些设施,就可以使用真正的依赖注入.因此,在您的代码中,您将使用真正的依赖注入.如果微软没有使用DependencyResolver那么你就必须在你的代码中使用它(作为服务定位器反模式),以便在你想要实现一些自定义功能时解决依赖关系.这对你不利.现在它对微软不利,但你不关心它们.

因此,我对于微软在2012年使用服务定位器的原因感到好奇和困惑.

因为设计框架与使用框架设计应用程序不同.在设计可重用的框架(如ASP.NET MVC)时,需要考虑一些不同的事情,而不仅仅是书中所写的内容.一些示例是以这样的方式设计框架:使用此框架的人将能够利用该框架在其代码中的书中编写的最佳实践.

  • 我不认为只是因为它是一个框架,服务定位器是合适的.是的,框架与应用程序不同,但完全可以在不使用服务定位器的情况下编写框架.只需看看ASP.NET MVC 1和2,甚至是像WCF一样复杂的东西.ASP.NET MVC 3+中DependencyResolver的问题在于它不仅仅是一个内部实现细节,而是作为公共'DI支持'发布和吹捧. (23认同)
  • 对于糟糕的开发人员问题没有解决方案.这并不会以任何方式使我的观点无效.服务定位器不是解决该问题的补救措施...... (11认同)
  • +1框架遵循与应用程序不同的规则.您希望保持框架容器不可知(如果想要使用框架的应用程序已经使用不同的容器)并且您通常不希望在这些应用程序上强制使用DI(因为他们可能不想使用DI在所有). (9认同)
  • 以下是一些提示:http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 (4认同)
  • 我尊重达林,但达林没有写过我像马克西曼那样敬拜的书.在这一点上,我需要做更多的研究,看到更多的答案. (4认同)
  • @MarkSeemann,那么将这个作为答案发布会很不错.看来OP正在寻找更多答案. (4认同)
  • 我也很高兴看到更多答案。@MarkSeemann,请随意发布您的。这就是为什么 SO 是一个很棒的网站——它提供了截然不同的观点。如果我错了,请纠正我,但你说“糟糕的开发人员的问题没有解决方案”。由于我们正在讨论服务定位器模式,并且使用此模式的开发人员恰好是设计 ASP.NET MVC 框架的开发人员,因此我以某种方式得出这样的结论:您暗示糟糕的开发人员设计了此框架(实际上是架构师) ,因为他们做出了这种设计决策)。 (2认同)
  • 我真的不想再次猜测MVC开发团队了.我不是说他们是糟糕的开发人员和架构师,但我认为在这种特殊情况下,他们做出了一些糟糕的决定.总的来说,我喜欢MVC框架,所以总的来说,我认为他们比糟糕的决策做得更好.当我提到上面的"糟糕开发者"时,我正在考虑一个完全不同的"坏"水平:) (2认同)

Haa*_*ked 35

正如Darin指出的那样,ASP.NET MVC 4是一个框架,并且与容器无关.这就是它提供服务定位器的原因IDependencyResolver.这允许任何人插入他们选择的容器.

但是,我不会称之为反模式.这允许您使用您选择的容器,但它不会强制使应用程序开发人员使用服务位置.如果框架迫使开发人员使用服务位置,那么我会称之为反模式.但构建ASP.NET MVC应用程序的开发人员可以通过构造函数注入,属性设置或服务位置自由使用DI.这是他们的选择.

查看由我或ASP.NET MVC团队发布的所有ASP.NET MVC依赖注入示例.在几乎所有情况下,他们都在使用构造函数注入.他们没有使用服务地点.

实际上,大多数ASP.NET MVC源代码本身并不使用服务位置来检索依赖项.MVC调用遗留API等服务定位器的几个关键位置.但那是关于它的.

  • 这似乎是合理的,我仍然想知道为什么我收到了来自Marcin Dobosz(http://blogs.msdn.com/b/marcinon/)的电子邮件回复给我,他说有关Mark的书/服务定位器是反模式他说:"我没有读过这本书所以我不熟悉为什么它是反模式的论点.你能否澄清为什么你认为这是一个糟糕的设计?" (3认同)
  • 为了澄清,我通过电子邮件发送了Marcin,我知道他为微软工作,并且很惊讶他从未听说服务定位器被称为反模式(这很容易在互联网上找到)我不是想把他扔到巴士,但这是一个例子,我想到马克S.所指的是什么. (3认同)