我有一个带有 DDD 数据层的框架,它使用服务定位器模式。但是,目前我使用全局静态 ServiceLocator
类来存储所有引用。我想将其重构为正确的实现,其中类实现 IServiceProvider 接口(interface),并删除全局静态 ServiceLocator 类。
现在,除了实体类之外,几乎所有地方都可以使用 IServiceProvider
接口(interface)扩展现有类。问题是,我认为实体类必须实现 IServiceProvider 非常奇怪,但我确实需要一种访问服务提供者的方法,以便能够通过我的 IoC 容器解析存储库。
无需在我的实体上实现 IServiceProvider
即可实现服务定位器模式的最佳方法是什么?
最佳答案
到底为什么实体(业务对象)会公开 IServiceProvider?它是一个业务对象,而不是服务。而IServiceProvider甚至不是针对服务的,它是一种暴露服务提供者的IOC机制。
如果有的话,您的 ORM/业务对象框架/运行时是一个服务提供者,而不是单个实体。
让我返回问题:我没有看到任何实体公开 IServiceProvider 的合理编程概念。
---更新
服务只应该提供一个服务定位器 - 并且您应该拥有一个。对于定义的线程访问元素(例如名称:UI - UI 元素必须由 UI 线程按规范访问)的情况,您可以使用线程静态变量,这会破坏全局单例。
关于c# - 服务定位器模式和 DDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9361156/