2

我有一个带有 DDD 数据层的框架,它使用服务定位器模式。但是,目前我使用存储所有引用的全局静态ServiceLocator类。我想将其重构为正确的实现,其中类实现IServiceProvider接口并删除全局静态ServiceLocator类。

IServiceProvider现在,除了实体类之外,几乎在所有地方都可以使用接口扩展现有类。问题是我认为实体类必须实现非常奇怪IServiceProvider,但我确实需要一种访问服务提供者的方法,以便能够通过我的 IoC 容器解析存储库。

无需IServiceProvider在我的实体上实施服务定位器模式的最佳方法是什么?

4

2 回答 2

3

为什么实体(业务对象)会公开 IServiceProvider?它是一个业务对象,而不是一个服务。而 IServiceProvider 甚至不是针对服务的,它是一种 IOC 机制,用于暴露服务提供者。

如果有的话,您的 ORM / 业务对象框架 / 运行时是服务提供者,而不是单个实体。

让我返回问题:我没有看到任何明智的编程概念,其中实体从 IServiceProvider 开始。

- -更新

服务只应该提供一个服务定位器——你应该有一个。您可以在定义的线程访问元素(例如名称:UI - UI 元素必须由 UI 线程按规范访问)的情况下使用线程静态变量,这会破坏全局单例。

于 2012-02-20T12:41:22.523 回答
3

服务定位器最好与 Unity、Castle Windsor 或 NInject 等控制反转容器结合使用。有关与 Unity 一起使用的服务定位器的示例,请参阅http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator 。

请记住,Service Locator 可以被视为一种反模式——应该非常小心地使用它。改用构造函数或属性注入要好得多。但是在依赖关系非常依赖于正在执行的功能的情况下,Service Locator 有一席之地。

于 2012-02-20T12:47:26.570 回答