Domain driven design DDD存储库:使用DAO进行分离?
关于它们在stackoverflow和整个web上的使用和布局存在争议。我对如何在存储库后面高效地实现数据访问抽象(例如数据库)感到困惑 我不是在使用ORM工具/框架,因为我想自己看看细节。目前,我正在使用DAO对象访问(mysql)数据库并提供业务对象(域对象)。数据库表中外键给出的关联将在相应对象的DAO中解析和加载(当前没有延迟加载)。因为我不想在业务逻辑中直接使用我的数据库DAO,所以我认为存储库是一个很好的进一步抽象。在存储库中实现诸如GetEmployeesByShopAndPosition()之类的复杂查询时,我遇到了困难:我看到了两种实现这种查询的可能性:Domain driven design DDD存储库:使用DAO进行分离?,domain-driven-design,repository-pattern,dao,Domain Driven Design,Repository Pattern,Dao,关于它们在stackoverflow和整个web上的使用和布局存在争议。我对如何在存储库后面高效地实现数据访问抽象(例如数据库)感到困惑 我不是在使用ORM工具/框架,因为我想自己看看细节。目前,我正在使用DAO对象访问(mysql)数据库并提供业务对象(域对象)。数据库表中外键给出的关联将在相应对象的DAO中解析和加载(当前没有延迟加载)。因为我不想在业务逻辑中直接使用我的数据库DAO,所以我认为存储库是一个很好的进一步抽象。在存储库中实现诸如GetEmployeesByShopAndPosi
我知道这个主题不是黑/白的,因为涉及的设计模式也可以以不同的方式实现,但我想有一些指导原则不应该被打破或混淆,以分离关注点和持久性无知(PI).您实际上在这里问了很多问题,所以我会尽量让答案尽可能简洁:) 存储库返回一个
聚合根
或一个实体
。有些人非常坚决地认为,存储库只返回AR,这很好,而且总是足够的
有两种类型的存储库(正如沃恩·弗农(Vaughn Vernon)在《实现领域驱动设计》(Implementing Domain Driven Design)一书中所描述的):
- 面向收藏
- 面向持久性
DataTable
、DataRow
、string
之类的东西,如果需要,有时还会使用复杂的DTO
存储库只与AR有关,例如:
- 得到
- 加
- 除去
值对象
都可以。对于关联的AR,可以使用ID或值对象来表示外部AR。AR本身可能由复杂结构组成,但不要将所有权与包含混淆。订单中包含订单行
。客户
拥有订单
。因此,Order
将有一个OrderLine
集合,但不是对Customer
对象的引用(而是ID/VO)
Order
/OrderLine
示例说明了我们为什么不查询域。当我们想要一个在给定的开始日期和结束日期之间的订单列表时,我们可能对所有订单数据不感兴趣,当然对订单行也不感兴趣。因此,装载这些骨料毫无意义。这就是在查询域时,诸如延迟加载之类的令人讨厌的事情悄悄出现的地方。惰性加载不应该存在(IMHO:)---在这里,一个简单的查询层就足够了
希望这能有所帮助。您实际上在这里问了很多问题,所以我会尽量让答案尽可能简洁:)
存储库返回一个聚合根
或一个实体
。有些人非常坚决地认为,存储库只返回AR,这很好,而且总是足够的
有两种类型的存储库(正如沃恩·弗农(Vaughn Vernon)在《实现领域驱动设计》(Implementing Domain Driven Design)一书中所描述的):
- 面向收藏
- 面向持久性
您可能会经常遇到并使用面向持久性的方法。这可能就是w.r.t.DAO的困惑所在。当然,DAO可能会返回一个业务对象,但它可能会返回更多
在查询示例中,DAO可能更合适。因此,在领域驱动的设计领域,您经常会遇到CQR(命令/查询责任分离)。它归结为不查询您的域
您应该有一个精简的、专用的查询层,它以最合适的格式返回结果(但不是实体)。在c#中,我使用诸如DataTable
、DataRow
、string
之类的东西,如果需要,有时还会使用复杂的DTO
存储库只与AR有关,例如: