服务定位器模式和DDD

本文关键字:DDD 模式 定位器 服务 | 更新日期: 2023-09-27 18:25:15

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

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

在不必在我的实体上实现IServiceProvider的情况下,实现服务定位器模式的最佳方式是什么

服务定位器模式和DDD

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

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

让我返回一个问题:在实体公开IServiceProvider的情况下,我看不到任何合理的编程概念。

---更新

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

服务定位器最好与控制倒置容器结合使用,如Unity、Castle Windsor或NInject。看见http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=主页&ProjectName=commonservicelocator,用于Unity的服务定位器示例。

请记住,服务定位器可以被视为一个反模式——应该非常小心地使用它。相反,使用构造函数或属性注入要好得多。但是,在依赖关系在很大程度上依赖于正在执行的功能的情况下,ServiceLocator有一席之地。