zoukankan      html  css  js  c++  java
  • 基础才是重中之重~Data层如何调用BLL层的方法,如果觉得奇怪请看本文章

    回到目录

    看似不伦不类

    这个题目有点不伦不类,或者说有点伪模式了,不错,确实是这样,我们正确的开发思维是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监视工作看到的结果就是它们处在同一事务块里,呵呵.

    回到目录

  • 相关阅读:
    第一章ASP.NET SignalR简介
    第六章SignalR的服务器广播
    第五章SignalR的实时高频通讯
    第四章SignalR自托管主机
    第三章SignalR在线聊天例子
    第二章SignalR所支持的平台
    DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)
    改进的简单Tooltips显示
    C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
    一些自用的小工具,分享给非程序猿们
  • 原文地址:https://www.cnblogs.com/lori/p/3459008.html
Copyright © 2011-2022 走看看