上一次我们完成了数据访问层的接口和实现,这次我们按部就班的完成业务层接口及实现,并采用spring.net声明式事务.另外,采用nunit对业务实现进行单元测试.
象petshop框架一样,我们先定义业务层接口,这里只和实体有有耦合.我们拿用户User为例:
IUserManager
同理,这里也是简单使出了几个通常的增删改查的接口,其它的业务接口我们在接下来的前台实现中,再来添加.
UserManager
UserManager
UserDao这个对象在上一次的Dao.xml中已经定义过了.
接下来我们来实现声明式事务,在Services.xml中添加:
transactionManager
TransactionAttributes中的列出的值表示对对应的方法采用事务,比如对Save开头的方法支持事务.(*是通配符),其中value的值可以有以下几种:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作.
readOnly表示此方法只读的,不能够修改数据
关于声明式事务的一些细节在下面的两个文章中可以了解详细些:
http://javabrain.javaeye.com/blog/106391
http://caterpillar.onlyfun.net/GossipCN/SpringGossip/TransactionAttributeSource.html
接着,我们再添加采用了事务的业务对象,继承于我们声明的事务基类.
UserManagerTrans
这样就完成了业务部分,让我们测试一下吧.首先添加Services.xml到objects.xml中.接下来就添加UserManagerTest.cs来完成对用户保存的测试:
UserManagerTest.cs
采用声明式事务的好处就是把事务的操作和数据访问的限制从具体的业务层中解耦出来,在实际写业务层的时候,不用关心事务的操作,同样,在这里也可以采用aop的方式实现日志,异常,权限.
本次代码下载
作者:孤独侠客(似水流年)
出处:http://lonely7345.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。