精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-02-18
下面的代码<2><3>可以合并为一个操作 order.removeByItemName("tv") 从完全自然的角度来看下面这个用例: 我的订单号是001,我要求取消我定的10样货品中的电视机那一相 那么什么都不考虑.我的最自然的想法大概是这样的(只是个例子流程,当然也不一定要是这么个顺序) <1>Order: order =getOrderByID(String ID); <2>orderItems=order.getOrderItems(); <3>orderItems.remove("电视机"); <4>save(order) 这里有个问题<1><4>两个操作放在什么地方呢? 这里有AB两个解决方案: A: 放在DAO里面(hibernate in action 就是这么作的<意思上是一样的>): <1>Order: order =OrderDAO.getOrderByID(String ID); <2>orderItems=order.getOrderItems(); <3>orderItems.remove("电视机"); <4>OrderDAO.save(order) 但是注意了DAO反回的对象是grained domain Object ,也就是OrderDAO依赖于 Order.这个思维也和PEAA的作者思维一致{order.getOrderItems(); 这一步很有可能也需要访问数据库}.但是这也有个问题1和4这部分代码在哪里?SERVICE层orderService? B:用Order 包装dao 用 <1>Order: order =Order .getOrderByID(String ID); <2>Map orderItems=order.getOrderItems(); <3>orderItems.remove("电视机"); <4>order .save(order) 这个方案看上去要更为优雅,mvc 的control层只要了解domain object就可一了,可能测试的时候比较复杂。要操作数据库。而且导致了业务对象依赖于DAO对象。 为什么大师们都选择A方案? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-02-18
关于A方案和B方案的利弊,大家给点意见!
|
|
返回顶楼 | |
发表时间:2005-02-18
这是一个论坛讨论过很多次的话题,建议还是先翻翻历史帖子,我的观点是用A方法。
|
|
返回顶楼 | |
发表时间:2005-02-18
用A 问题是1和4这部分代码在哪里?SERVICE层orderService?
|
|
返回顶楼 | |
发表时间:2005-02-18
如果严格分层的话,是在DAO层来实现。不过如果业务逻辑比较简单,基本上都是数据库的存取查询操作的话,DAO也可以和BO合并。
严格的分层应该是这样子的: Business Object - > DAO Interface - > DAO Implements - > Domain Object DAO Interface定义domain的CRUD操作,DAO Implements编写具体的数据库访问代码,并且处理资源管理(获取数据库连接,释放数据库连接),Business Object调用DAO Interface来完成具体的业务流程,事务控制要放在Business Object的methods上面。 |
|
返回顶楼 | |
发表时间:2005-02-18
我的意思是<1>和<4>这两步骤在哪里调用?就是说在哪里调用DAO的方法.不会在表现层吧,另外,你说的Business Object 和 Domain Object 是什么?区别在哪里?
比如: <1>Order: order =getOrderByID(String ID); <2>orderItems=order.getOrderItems(); <3>orderItems.remove("电视机"); <4>save(order) 我这里的Order和OrderItem是Business Object 还是Domain Object? |
|
返回顶楼 | |
发表时间:2005-02-19
zengdou 写道 我的意思是<1>和<4>这两步骤在哪里调用?就是说在哪里调用DAO的方法.不会在表现层吧,另外,你说的Business Object 和 Domain Object 是什么?区别在哪里?
比如: <1>Order: order =getOrderByID(String ID); <2>orderItems=order.getOrderItems(); <3>orderItems.remove("电视机"); <4>save(order) 我这里的Order和OrderItem是Business Object 还是Domain Object? Order和OrderItem都是domain object,1和4方法定义在DAO Interface,方法的实现是由DAO Implements来做的。1和4方法被BusinessObject所调用。 |
|
返回顶楼 | |
发表时间:2005-02-19
我认为既然是具体的实现,没必要规定1,4方法再那里被调用。
假如。 接口定义如下: OrderService createOrder(Order order)。 那么1,4放在xxService是自然的。 但假如定义如下: OrderService createOrder(). 那么把1,4放在DomainObject又是自然的事情。 |
|
返回顶楼 | |
发表时间:2005-02-19
把1和4方法放在domain object本身会带来很多坏处,传统的Entity Bean就是这样做的,前面好多帖子已经充分讨论过了。
|
|
返回顶楼 | |
发表时间:2005-02-19
to zengdou:
这年头帖子也有盗版的,从标题到例子都和我以前发的帖子一样.大哥偶知道您整理的也挺辛苦可是至少把俺的名号拉上阿.呵呵 |
|
返回顶楼 | |