基础才是重中之重~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监视工作看到的结果就是它们处在同一事务块里,呵呵.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2012-12-05 Html内容超出标记宽度后自动隐藏