c# - 服务定位器模式和 DDD

标签 c# .net design-patterns domain-driven-design service-locator

我有一个带有 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/

相关文章:

c# - 将 oracle 查询的嵌套选择转换为 linq

c# - 是否可以在不将原始阅读器向前移动的情况下创建 TextReader 的副本?

c# - 如何选择数据表中列的最小值和最大值?

.net - 嵌套多映射的 Dapper 语法

c# - 是否可以在自己的 .Net 应用程序中嵌入 Windows Sidebar Widgets

c# - c#中set obj为null是否需要释放内存?

c# - NHibernate - 非空属性引用空值或 transient 值

design-patterns - 软件设计模式视频?

java - 使用 Bloch 的 Builder 模式是否会影响内存和性能?

c++ - 成员函数的模板类和类型返回类型