最近研究ddd,很疑惑,比如说 订单和订单项, 订单是聚合根,对应创建一个OrderRepository, 那么操作订单项的操作也在OrderRepository里面定义吗?如 updateOrderItem; 那么这个Repository是不是很庞大,好疑惑,求大神指导
这个需要额外定义出来么?这个应该是在自己内部消化掉了,仓储是不关心业务,同样的上面在使用仓储的时候也不关心你怎么搞出来的。
仓储是不涉及业务,但是它得连接业务跟数据吧,我要更新订单子项该如何处理呢?或者更多的,我一个聚合里面有好几个实体,我所有的存储更新都放在一个Repository吗? 如果说用hibernate这样的框架,貌似也可以做到,比如 Order里面包含了OrderItem这个对象,hibernate可以自动持久化或更新OrderItem,但是我没有用到hibernate这种持久化,是不是就做不到了
@Ywdj_yun: 用orm框架可以较容易的解决面相对象及关系型数据库衔接的问题,如果不用的话这块是比较矛盾,我感觉可以在仓储上再加一层(或在你现在的仓储下再多一层)解决一个聚合对象的的存储问题(简单的理解的话就是针对你这里面的对象都有单独的repo来负责,而暴露出来的repo中的方法只是对这些子repo的组织,类似service对于domain object)
@Daniel Cai: 我曾想过,就是Repository不关心具体怎么去持久化、更新,而由具体的Repository实现去对相应实体持久化更新,但是总感觉很别扭,如 interface OrderRepository {
void updateOrder(Order order);
}
class Order{
List<OrderItem> orderItems;
}
class OrderRepositoryImpl implements OrderRepository {
void updateOrder(Order order) {
updateOrder(order);
updateOrderItem(order.orderItems);
}
}
@Ywdj_yun: 这个挺好的啊,仓储已经充分封装了最终存储的细节了。
@Daniel Cai: 是吗?其实用hibernate这种框架,他通过映射文件为我们隐式做了这样的事情,只是我没这么操作过,我不知道是否合理、好不好,一直在纠结否定中
@Ywdj_yun: orm存在不就是干这些的么?
@Daniel Cai: 嗯,是的,谢谢!就这么做先!