对领域驱动设计的疑惑
在论坛也看了能久了,越看是越疑惑啊
现在根据学到的来做个简单的多层设计
各层依次顺序如下:
ACTION ------Domain object(Servcie+ServiceImp+BO)-----DAO------daoImp----DB
简单代码实现如下:
Interface OrderService
{
public void CreateOrder(OrderBO);
Public void UpdateOrder(OrderBO);
}
Public class OrderServiceImp implement OrderService{
private OrderDAO orderdao
Public void CreateOrder(OrderBO)
{
PO=change(ORDERBO);
this.orderdao.saveOrderPO(orderPO);
}
……….
……….
}
Interface OrderDAO{
Public void addOrderPO(orderPO);
…..
}
public class Order{
//属性……get//set
public void addItem(Item item) {
}
public Collection getItems() ...
public void removeItem(Item item) ...
}
问题:
一.如何处理BO与PO之间的关系呢,
在上述代码中,DAO接受的是PO,Service接受的是BO,两者在Service的实现类中进行转化,
这样做是不是合理呢?是否应用用一个DTO来充当中间者?另外个人感觉BO的实体对象与PO没什么多大区别啊(可能是道行不深啊),既然这样那就用PO或BO贯穿各层不知道可行不?
http://www.jdon.com/article/32028.html
这个帖子的也看了,BANQ有这么一段描述
>>>> 正因为PO是数据表驱动设计的产物,我们采取Evans DDD等对象建模,那么就没有PO这个概念了,有的都是实体对象,ProductPic可以算一个实体对象,但是它是从属于Product的,是Product的关联子对象,被包含在product中,他们之间关系是对象的1:N关联关系。
事实上这样产生的两个对像跟PO没什么多大区别啊?充其量也就是个叫法不同吧?能举个简单的例子BO实体对象不是PO的吗?
二.BO中的业务方法问题
在领域设计中如果区分服务与BO实体自身的业务方法呢?上面代码将CreateOrder, UpdateOrder作为服务,将addItem, removeItem作为自身的业务方法.凝或的是removeItem等这些方法真的没必要通过服务暴露给外层吗?在实际中通常都是传入一个ID值然后删除ITEM对象,不暴露的话,难道每次删除都要通过Order导航吗?