对领域驱动设计的疑惑

zwjsoft 07-10-12
              

在论坛也看了能久了,越看是越疑惑啊
现在根据学到的来做个简单的多层设计
各层依次顺序如下:
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导航吗?

              

zwjsoft
2007-10-12 23:13

或者说由HIBERNATE产生的对象加入与该对象有紧密关系的方法后能不能成为BO的的实体对象呢?并在各层中传递?
恳请哪位指点一下
回复不要过于学术化,因为我看不懂啊,呵

boyszz
2007-10-13 16:04

目前为止,我只有在一个对象有比较多的状态时会区分PO和BO(这里我理解PO为持久对象,BO为领域对象,理解错了下面也就是废话了。)
在设计这样的对象的时候,PO中我通常会用byte字段描述状态其状态,比如0代表超级管理员,1代表VIP用户,2代表普通用户而在BO中我会使用isAdmin(),isCommonUser(),isVip()这样的方法来描述.
如果状态少,比如只有一个状态字段,那不区分PO,BO我觉得也没关系.两个方法都提供了就可以.
分层只是一个建议,并不是规范.我认为应该适情况而定,就像楼主你上面提供的Dao层和Service层.如果你只是简单的对一个对象执行插入,更新,删除等持久化操作,真的有必要添加一个Service层吗?如果只是一些简单的参数合法性检查,真的一定要放在Service层里?放Dao里就不行么?Dao层的方法只能针对单表操作吗?
像省份,国家之类的配置表,在可预见的将来应该不可能会有什么复杂的逻辑操作.这种时候是否还需要为其添加个Service层我持有怀疑态度.

zwjsoft
2007-10-13 16:36

那BO怎么组成呢?像boyszz举的例子时,PO,BO绝对多数的属性是相同的?BO要重新写一个吗?还是继承PO然后加入像isAdmin(),isCommonUser(),isVip()这样的业务方法呢?

boyszz
2007-10-13 16:47

当一个对象有很多状态,需要区分的时候,我就会重新写.BO中我不会包含adminFlag,activeFlag,level这样的状态,统一用boolean类型去代替.PO中则不会包含那些boolean类型字段.
当一个对象只有少数状态,我就不会写两个User对象(UserBO,UserPO),只写一个User对象,业务层,持久层都使用这个领域对象

2Go 1 2 下一页