Eric Evan 的 DDD 书,第 页。152:
仅为实际需要直接访问的 AGGREGATE 根提供存储库。
1. 是否应该通过需要直接访问的聚合根的存储库来检索和保存不需要直接访问的聚合根?
例如,如果我们有Customer
和Order
聚合根,并且无论出于何种原因我们不需要直接访问AR,那么我假设获得订单Order
的唯一方法是通过遍历属性?Customer.Orders
2.什么时候应该ICustomerRepository
检索订单?何时Customer
检索 AR(通过ICustomerRepository.GetCustomer
)或当我们遍历Customer.GetOrders
属性时?
3.ICustomerRepository
自己应该检索订单还是应该将此责任委托给一个IOrderRepository
?如果是后者,那么一种选择是IOrderRepository
注入ICustomerRepository
. 但是由于外部代码甚至不应该知道它的IOrderRepository
存在(如果外部代码知道它的存在,那么它也可以IOrderRepository
直接使用),那么应该如何ICustomerRepository
获得对IOrderREpository
?
更新:
1
关于实现,如果使用像 NHibernate 这样的 ORM 完成,则不需要 IOrderRepository。
a) 你是说在使用 ORM 时,我们通常不需要实现存储库,因为 ORM 隐式提供了它们?
b)我确实计划学习一种 ORM 技术(可能是 EF),但是从我读过的关于 ORM 的内容来看,似乎如果你想将域或应用层与持久层完全解耦,那么这两层不应该使用ORM 表达式,这也意味着 ORM 表达式和 POCO 应该只存在于 Repository 实现中?
c)如果存在某种情况,由于某种原因 AR root 没有直接访问权限(并且项目不使用 ORM),那么您对 3. 的回答是什么?
谢谢