日期:2014-05-18  浏览次数:20703 次

SSH架构中关于业务逻辑层的理解,还请大家指正,谢谢
SSH架构中关于业务逻辑层的理解,还请大家指正,谢谢

业务逻辑:一个用烂的词.

1.什么是业务逻辑?
业务逻辑即业务规则:除掉简单的增删改查的数据访问之外,
还会涉及到一些复杂的功能流程和功能要求,称之为业务逻辑

2.举例
银行转帐:一个人余额加,一个人余额减,同时还要保证余额足够,
还有不能同一帐号互转,可能还有一天只能转多少钱的限制.

入库审核:库存增加,应付帐增加,审核标识要修改.已经审核过的不能再审核.

论坛用户注册:包括要向邮箱发送电子邮件,如果发送失败,则注册失败.

通常审核必须要有相应权限.涉及到权限问题

滞纳金的多种计算策略:

联通的手机话费的优惠策略:
          凡月话费总额超过300元者,市话费可享受85折优惠;
          月话费总额超过600元者,市话费可享受8折优惠。
          由于市场策略变化,可能每个月的优惠策略都要发生变化


3.特点
3.1.与数据操作的关系
可能包含多次数据操作
可能同时包含数据操作与非数据操作
只有非数据操作

3.2.可维护性的要求
也有可能不会修改(如用户注册发送邮件)
但表示策略的逻辑通常会经常修改(如联通手机话费优惠).
所以有些情况不适宜用存储过程,不便于维护与重用.


4.实现业务逻辑通常碰到的几个问题
4.1.包含多次数据操作时,如何使它们处于同一session,同一事务
ThreadLocal
4.2.如何将非数据库事务与数据库事务归整到同一事务(如发送邮件失败,则用户注册失败)
JTS
4.3.通常复杂的权限控制会置于业务逻辑中
ACEGI
4.4.如何处理业务规则频繁变化?
spring的ioc


5.如何设计业务逻辑类
ssh架构中,如果是功能-表的简单对应,
可以通过元素form,action,vo,dao,action简单实现
如果引入业务逻辑,可再引入service层
按依赖规则,其中service中只使用dao与po,不得使用form与action
鉴于业务逻辑的频繁变化,则需引入接口-实现类机制,便于使用spring的ioc机制进行切换.
至于dao本身使用接口似乎多此一举.
在hibernate   synchronizer中使用接口则是考虑自动生成代码与手工编码的统一问题.

6.实现举例

PO如下
public   class   UserPO   implements   序列化接口
{
private   Integer   userId   ;//数据库用
private   String   code   ;//用户自定义用
private   String   name   ;
private   Double   salary   ;//薪水
private   java.util.Date   birthDate   ;//出生日期
//getter   and   setter....
}

DAO如下
public   class   UserAddDAO   extends   BaseDAO
{
private   UserPO   userPO   ;
public   void   execute()
{
//call   hibernate   method
}
//getter   and   setter....
}

vo接口
public   interface   IUserAddService
{
void   execute()   ;
}

vo实现类
public   class   UserAddServiceA   implements   IUserAddService
{
public   void   execute()
{
//可简单调用dao
//但以后可随时扩展,如发送电子邮件等内容
}
}

form如下
public   class   UserForm   extends   ValidatorForm
{
private   String   userId   ;//数据库用
private   String   code   ;//用户自定义用
private   String   name   ;//昵称
private   String   salary   ;//薪水
private   String   birthDate   ;//出生日期
//getter   and   setter....
}

action如下
public   class   UserAddAction   extends   Action
{
//以便以后使用spring进行注入,暂时未使用
private   IUserAddService   userAddService   ;

public   ActionForward   execute(MappingForm.....)
{
UserForm   userForm   =   (UserForm)form   ;
UserPO   userPO   =   new   UserPO()     ;
  BeanUtils.copyProperties(userVO,userForm);
  userAddService   =   new   UserAddServiceImpA()   ;
  userAddService.setUserPO(userPO)   ;
userAddService.execute()   ;
//异常与转向省略
}
}

当然加入hibernate   synchronizer之后要多很多类,这里暂不表.
有错误之处,还请大家指正.也希望大家提出建议,谢谢.