首页 新闻 会员 周边 捐助

ddd repository如何设计

0
[已解决问题] 解决于 2017-03-29 16:24

最近研究ddd,很疑惑,比如说 订单和订单项, 订单是聚合根,对应创建一个OrderRepository, 那么操作订单项的操作也在OrderRepository里面定义吗?如 updateOrderItem; 那么这个Repository是不是很庞大,好疑惑,求大神指导

Ywdj_yun的主页 Ywdj_yun | 菜鸟二级 | 园豆:202
提问于:2017-03-27 19:52
< >
分享
最佳答案
0

这个需要额外定义出来么?这个应该是在自己内部消化掉了,仓储是不关心业务,同样的上面在使用仓储的时候也不关心你怎么搞出来的。

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2017-03-28 09:20

仓储是不涉及业务,但是它得连接业务跟数据吧,我要更新订单子项该如何处理呢?或者更多的,我一个聚合里面有好几个实体,我所有的存储更新都放在一个Repository吗? 如果说用hibernate这样的框架,貌似也可以做到,比如 Order里面包含了OrderItem这个对象,hibernate可以自动持久化或更新OrderItem,但是我没有用到hibernate这种持久化,是不是就做不到了

Ywdj_yun | 园豆:202 (菜鸟二级) | 2017-03-28 18:46

@Ywdj_yun: 用orm框架可以较容易的解决面相对象及关系型数据库衔接的问题,如果不用的话这块是比较矛盾,我感觉可以在仓储上再加一层(或在你现在的仓储下再多一层)解决一个聚合对象的的存储问题(简单的理解的话就是针对你这里面的对象都有单独的repo来负责,而暴露出来的repo中的方法只是对这些子repo的组织,类似service对于domain object)

Daniel Cai | 园豆:10424 (专家六级) | 2017-03-29 09:42

@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 | 园豆:202 (菜鸟二级) | 2017-03-29 12:40

@Ywdj_yun: 这个挺好的啊,仓储已经充分封装了最终存储的细节了。

Daniel Cai | 园豆:10424 (专家六级) | 2017-03-29 13:51

@Daniel Cai: 是吗?其实用hibernate这种框架,他通过映射文件为我们隐式做了这样的事情,只是我没这么操作过,我不知道是否合理、好不好,一直在纠结否定中

Ywdj_yun | 园豆:202 (菜鸟二级) | 2017-03-29 14:00

@Ywdj_yun: orm存在不就是干这些的么?

Daniel Cai | 园豆:10424 (专家六级) | 2017-03-29 15:24

@Daniel Cai: 嗯,是的,谢谢!就这么做先!

Ywdj_yun | 园豆:202 (菜鸟二级) | 2017-03-29 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册