关于服务定位器实现的问题

时间:2013-03-31 01:56:29

标签: c# .net dependency-injection service-locator

我需要你的帮助,我知道服务定位器不是最佳选择之一,但考虑到它的实现。

最正确的是每层中都有一个Locator类,这个类是否负责解析该特定层的依赖关系?

示例:业务层有自己的服务定位器类,只能解决该层的依赖关系,数据访问层也有自己的定位器。

如果不是最好的选择,你有什么建议?

事先,谢谢。

1 个答案:

答案 0 :(得分:1)

每层不应该有一个服务定位器。整个应用程序中应该只有一个Composition Root,这将是您解析对象图的唯一位置。你不应该在图层中分解。

例如,MVC HomeController可能依赖于IRepository<T>(DAL层)或ICommandHandler<T>(业务层),这些应该只是{{1}中的依赖项的构造函数。在HomController尝试单元测试时,将HomeController调用BusinessLayerServiceLocator.GetInstance调用会导致问题。它会使应用程序的布线更加困难。

但是,这并不意味着您应该在启动项目中放置连接图层的代码。例如,您可以将连接所有业务类的代码放在业务层程序集中,或放置在“业务层程序集”之上的程序集中。但是,只有在多个应用程序(例如MVC和WCF项目)之间共享此业务层时,才应执行此操作。当你这样做时,你仍然不应该在业务层中有一个服务定位器。相反,您应该将容器实例传递给业务层的Bootstrap方法。这样它就可以配置容器实例,但最终应用程序会保留引用并保持控制。