【发布时间】:2014-04-29 11:05:16
【问题描述】:
当我第一次了解领域驱动设计时,我还被介绍了存储库和工作单元模式,这些模式曾经似乎是那些像穴居人一样向数据库抛出 SQL 查询的酷孩子们的一流模式。我越深入该主题,我就越了解它们似乎不再是必需的,因为像 EF 和 NHibernate 这样的 ORM将工作单元和存储库实现到一个 API 中,称为会话或上下文。
现在我不确定该怎么做。到存储库或不存储库。我真的理解这样的论点,即这种泄漏的抽象只会使事情过于复杂,而绝对没有添加任何可以简化数据访问的内容,但是,将我的应用程序的每个可能方面与例如实体框架。通常,我遵循一些简单的准则:
- 领域层是系统的核心,包含实体、服务、存储库...
- 基础设施层提供基础设施关注领域接口的实现,例如文件、数据库、协议..
- 应用层托管一个组合根,用于连接和协调所有内容。
我的解决方案通常如下所示:
Domain.Module1
Domain.Module2
IModule2Repo
IModule2Service
Module2
Infrastructure.Persistence
Repositories
EntityFrameworkRepositoryBase
MyApp
Boostrapper
-> inject EntityFrameworkRepositoryBase into IRepository etc.
我使用IRepository<'T> 保持我的域层清洁,这也是一个域问题,不依赖于告诉我如何访问数据的任何其他内容。当我现在要对需要数据访问的IModule2Service 进行具体实现时,我将不得不注入DbContext 并由此将其直接耦合到基础设施层。
(来到 Visual Studio 项目,由于循环依赖,这最终会变得非常棘手!)
另外存储库和混杂的作品有什么替代品? CQRS?如何抽象出一个纯粹的基础设施框架?
【问题讨论】:
标签: c# entity-framework dependency-injection domain-driven-design repository-pattern