现在开发软件时,方式1。我一般按 组件的概念进行设计。将一个一个的SERVICES当成组件来看,将同一组功能操作定义在同一个SERVICES中。
而一个控制层(ACTION)则可能会调用到多个SERVICES进行操作。方式2。另一种实现方式是将所有功能操作封装到一个SERVICES。此种方式可能会涉及DAO交叉供不同SERVICES调用的情况。
功能操作我以DAO为基础来说明,以下图示说明
方式1:
方式2:
不知道大家认为以上两种方式哪种更好。
如果采用方式1的话,事务边界该如何控制实现。(SPRING)
欢迎大家发表意见,顶者有分。

解决方案 »

  1.   

    将服务层继续分为2层:一个一般服务层,一个原子服务层;原子服务层下属有原子DAO.
    事物的控制交由顶层的一般服务层,一个一般服务层可以调用多个原子服务,一个原子服务可以调用多个原子DAO.
    提出原子服务层和原子DAO的概念就是不想出现重复的开发,同时一个控制层(ACTION)只需要调用一个服务层,简化控制层代码。让控制层只关注获取的数据处理,一般服务层去关注数据处理逻辑,原子服务层关注一个不可划分的逻辑方案。
      

  2.   

    作为底层的DAO,它们不需要知道哪个service是调用者,即使被多个service调用也很合理。
      

  3.   

    我觉得方式2应该好点 如果想dao层不交叉的话那得多写service
      

  4.   

    这个取决于LZ的实际开发需要,应该没有优劣之分。
    如果复用service多,则采用方式 1,如果复用DAO多(service少),则采用方式2。
    这其实是一个组件粒度该划分到多大合适的问题,其答案也是根据开发的实际需要,没有统一的标准。
    至于采用方式1下的数据库事务,用全局事务控制JTA+start事务+commit或rollback组件应该是可以搞定的。
      

  5.   

    楼主的只是分层而已,并没真正体现组件设计....举个例子:比如登陆,我们可以把登陆看做一个组件,而登陆的方式又有许多种,专业俗语称为“策略”,那登陆组件可以有默认的“策略”,当在特殊情况下,需要其他登陆“策略”的时候,只要我们继续扩张次组件,就能满足需求,不用去关心其他功能是否会被影响。结论:
    组件是可重用的,面向业务的,它指针对单一问题而设计的,它的移除和修改是不会影响其他功能的正常运作的,它是面向AOP的,技术设计是OOA,思想设计是OOP,开发是OOD............典型的例子:
    HIBERNATE,SPRING,STRUTS,IBATIS,EXTJS,JQUERY,QUZRT,YAHUI等等......
    这些里面的架构都是基于面向业务的,所有都是以模式加组件而封装的.
      

  6.   

    3楼一般服务层可以调用多个原子服务的思路很好啊。不是DAO直接到服务层,而是到原子服务层。
    但多层的情况,不知道有没人试过SPRING的事务可以跨这么多层提供得了吗?
    我记得我试过把SPRING的事务拦截至ACTION会出错,多层SERVICES的我没试过。
    11楼不知道是什么意思,我看不到。12楼的想法和我一样。只是你没帮我解决使用方式一时,控制层调用多个SERVICES业务是否合理。在使用SPRING的事务时如何解决。