【发布时间】:2012-02-25 16:16:53
【问题描述】:
我在几个关于在 asp.net mvc3 中使用 Unity 的教程中看到了这行代码。我的印象是服务定位器是一种反模式,而不是最佳实践。这个服务定位器是不是定义的反模式,还是这行代码/这个实现被认为是不好的做法。
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(Container));
【问题讨论】:
-
我也看到这个使用了很多,在 Prism StockTrader RI 中,他们也使用带有 MEF 的 ServiceLocator。我也觉得这是一种反模式,因此在 RI 中看到它感到很惊讶。我确实相信这是与定义的反模式相同的服务定位器模式实现。
-
您倒退了:在您的示例中,使用服务定位器的不是 Unity,而是您的代码插件通过服务定位器统一到 asp.net mvc3。关于服务定位器模式的争论具有宗教性质。 asp.net mvc 团队必须提供一种使用您最喜欢的 DI 容器的方法,这就是他们实现它的方式。想想替代方案。以下是对该问题的更多见解blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx
-
@zespri - 所以不是所有的 Unity 实现都使用服务定位器?
-
我只知道一个 Unity 实现。它不使用服务定位器。如果您愿意,您可以将其用作服务定位器(即使 Unity 没有明确支持它),但在这种情况下它确实支持它。
-
@zespri - 我非常想避免使用服务定位器,你知道有哪些针对 asp.net mvc3 的教程,其中显示了没有服务定位器的简单统一设置吗?
标签: asp.net-mvc-3 unity-container service-locator