业务层Service的粒度问题请教

07-12-08 power1128
在业务层的Service中,比如我有两个Entity,Entity1和Entity2,那么我有两个对应的Service,Entity1ervice和Entity2Service.如果有些业务过程要涉及到两个或者多个Entity,那这些业务过程写在哪里?再建个Entity1Entity2Service?

2
banq
2007-12-10 10:13
这需要结合Evans DDD来进行业务分析,找出核心之领域模型,如果涉及多个实体,找出这些实体中的核心实体,放在它的service中。

power1128
2007-12-11 19:17
还有个问题请教:事务的边界应该在哪里声明?
我也搜索了一下,发现这个帖子和我的问题比较像:http://www.jdon.com/jivejdon/thread/17055.html.在他那里讨论的是Dao,而我的困惑是在Service中.那个帖子在Dao的各个方法中,需要传入Connection,保证事务的灵活;那么是不是在Service中是不是也需要传入Session保证事务的灵活,因为可能有更大的事务,比如:
Transaction tx = session.beginTransaction();
service1.method1(session);
service2.method2(session);
tx.commit();
但是在Service的每个方法中传入Session这个东西感觉不太对

还有个问题,这个边界应该声明在一个粒度更粗的Service里,还是申明在别的地方,比如面向Web层的facade里?

[该贴被power1128于2007-12-11 19:22修改过]

banq
2007-12-12 14:37
>Transaction tx = session.beginTransaction();
你用的是Hibernate的事务,Hibernate属于持久层,不能跳出来跑到业务层的。

业务层有自己的事务机制 JTA。如下:

TransactionManager tx = jtaTransactionUtil.getTransactionManager();
try {
tx.begin();
Long mIDInt = messageRepository.getNextId(Constants.MESSAGE);
forumMessage.setMessageId(mIDInt);
beforeCreate(forumMessage); super.createTopicMessage(em);
tx.commit();
} catch (Exception e) {
logger.error(e);
em.setErrors(Constants.ERRORS);
jtaTransactionUtil.rollback(tx); }

[该贴被banq于2007-12-12 14:37修改过]

killer
2007-12-12 20:12
我觉得service和entity不是一一对应的,只有entity需要合其他entity合作而之间又没有直接关联时才有service的概念

power1128
2007-12-13 09:14
多谢banq,我先研究下JTA.以前没接触过,如果有问题再来请教.

killer兄说的我不太肯定,但是我也发现基本需要service的地方,都不会是单独的一个Entity参与其中.是否每个Entity都对应一个Service并不重要,我觉得只要抓住业务的核心就没有问题,具体需要多少service由业务系统决定.

power1128
2007-12-13 09:15
多谢banq,我先研究下JTA.以前没接触过,如果有问题再来请教.

killer兄说的我不太肯定,但是我也发现基本需要service的地方,都不会是单独的一个Entity参与其中.是否每个Entity都对应一个Service并不重要,我觉得只要抓住业务的核心就没有问题,具体需要多少service由业务系统决定.

killer
2007-12-13 10:19
>>我觉得只要抓住业务的核心就没有问题,具体需要多少service由业务系统决定.

同意

elegantyu
2008-03-28 17:05
同意

猜你喜欢