看似不伦不类
这个题目有点不伦不类,或者说有点伪模式了,不错,确实是这样,我们正确的开发思维是WEB层->BLL层->DATA层,每个层有对它下层的引用,下层不能引用上层,因为这会出现相互引用的错误,在实际工作中,BLL层会有涉及到各个业务的代码组织,实现数据持久化一般在Data层完成,这是可以理解的,也是我们经常使用的开发模式,这当然不是今天的重点,今天主要说一个实际问题,如订单处理的场合.
一般订单处理流程如下:
1 用户选择商品到购物车
2 用户确定购买,生成订单
3 选择一种或者几种支付方式
4 支付完成,回写订单,修改订单状态
5 支付交易成功,或者失败
OK,这种订单业务事实上是很复杂了,它会涉及到很多表的操作,它可能由多个开发人员去编写,最后进行统一组合,而为了保证数据的有效性,我们会把代码重装到事务里,这时问题就来了
当你的订单主方法在data层实现,如何去调用bll已经写好的方法呢?我们总不能再重新写一个吧,当然不能,相同的代码不能出现两次,这是我们的原则,呵呵.
方法回调
概念:我们在一个方法里处理事件,事件处理完成后,再调用原方法层次的某个方法,这种调用,我们可以称为回调方法,它可以通过委托来实现,而对于如今的业务,我们也可以通过这种方式来实现,看一下DEMO
这是我们的data层方法签名:
public void GeneratorOrder(List<Order_Info> list, Action<IUnitOfWork, int, int> authorizeClassroom)
我们看到,它的参数里有个Action委托,它有三个参数,这个方法是通过BLL层传递进来的,当data层的工作完成后,可以回调这个BLL的方法,我们看一下BLL层这个方法的签名:
void AuthorizeClassroom(IUnitOfWork db, int userID, int classroomID)
看一下,BLL层去调用data层方法,将把委托实例以参数的形式传入data层
orderInfoRepository.GeneratorOrder(list, AuthorizeClassroom);
最后,使用我们的事务,把它们组合到一起(BLL层与Data层使用同一个事务,注意,它不是分布式事务,前提是它们的数据上下文是一个)
TransactionScopeNoMsdtc.UsingNoMsdtc(Db, true, () => { ... }
最后,通过SQL监视工作看到的结果就是它们处在同一事务块里,呵呵.