回到目录

本文来自于实践中的不足

在最近开始过程中,遇到了一个问题,之前设计的工作单元UoW只支持Insert,Update,Delete三种操作,即开发人员可以将以上三种操作同时扔进工作单元,由工作单元UoW负责事件的处理,这种设计已经出现很多年了,大叔感觉也是不错,思路就是在工作单元里添加三个字典对象,用来存储你的Insert,Update,Delete操作,然后在commit时,统一进行提交!

业务中完成的体现

在调试中,集成了select方法,即当添加,更新之后,你把最新数据拿到,并进行下一个业务的操作,这个过程中,拿数据也需要在事务中完成,而之前的设计是不支持这个功能的,可以说是个缺陷,本讲主要是解决了这个问题,在业务层,可以使用嵌套的注入来表示,代码一段如下:

       uow.RegisterChangeded(entity, SqlType.Insert, repository, (newEntity) =>{var old = repository.GetModel().FirstOrDefault(o => o.ID == entity.ID);old.DataCtrlName = "Name|Email";uow.RegisterChangeded(old, SqlType.Update, repository);});uow.Commit();

从上面代码中,我们看到了,在Insert方法里,有一个GetModel(),然后对实体进行赋值后,又调用了Update,这样就形成了一个Insert与update的嵌套,这里是使用了工作单元的嵌套.

对UoW的注册方法的修改

     /// <summary>/// 注册数据变更实体/// </summary>/// <param name="entity">实体类型</param>/// <param name="type">SQL类型</param>/// <param name="repository">仓储</param>/// <param name="action">方法回调</param>public void RegisterChangeded(IEntity entity,SqlType type,IUnitOfWorkRepository repository,Action<IEntity> action = null){switch (type){case SqlType.Insert:insertEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));break;case SqlType.Update:updateEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));break;case SqlType.Delete:deleteEntities.Add(entity, new Tuple<IUnitOfWorkRepository, Action<IEntity>>(repository, action));break;default:throw new ArgumentException("you enter reference is error.");}}

工作单元字典添加委托元素

  private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> insertEntities;private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> updateEntities;private IDictionary<IEntity, Tuple<IUnitOfWorkRepository, Action<IEntity>>> deleteEntities;

下面是程序运行后的截图,我们可以看到,整个过程是在serializable级别的事务里的,即最高的事务级别!

对于知识的总结与研究很重要,有时,我们对一个事物一定要有较真的精神,我经常这样对我儿子说,学英语,一定要较真

感谢各位的阅读!

回到目录

转载于:https://www.cnblogs.com/lori/p/5614374.html

Lind.DDD.UoW~方法回调完成原子化操作相关推荐

  1. 基础才是重中之重~何为原子化操作

    占占定义: 原子化操作,操作原子化,这在软件开发中经常被听到,那到底什么是操作原子化呢,其实从字面上不难理解,原子化就是一体化,整体化,原子化操作就是将多个操作组合在一起,要么这个组合一起发生,要么一 ...

  2. Lind.DDD.UoW工作单元的实现

    回到目录 工作单元UoW我们几乎在任务一个像样的框架里都可以找到它的足迹,是的,对于大型系统来说,他是很重要的,保持数据一致性,维持事务状态这都是它要为系统实现的功能,而在不同的框架里,实现UoW的机 ...

  3. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  4. 只更新代码,然后发布版本:基于 Serverless Devs 原子化操作阿里云函数计算

    众所周知,随着时间的发展,Serverless 命令行工具也逐渐的玩出了更多的花样,就目前来看,常见的形态有两种,一种是通过 Yaml 来进行资源的描述,另外一种是纯粹的命令行操作,而不依赖这些内容. ...

  5. Lind.DDD敏捷领域驱动框架~介绍

    最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...

  6. Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP

    .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常记录,用户 ...

  7. 原子化服务的官方解析来啦~

    一直关注我们的小伙伴们肯定听说过"原子化服务"了,可能有些小伙伴还听说过"元服务".元服务,其实就是原子化服务.那么原子化服务到底是什么,权威的官方解析来啦~ ...

  8. Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

    回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...

  9. Lind.DDD.Caching分布式数据集缓存介绍

    戏说当年 大叔原创的分布式数据集缓存在之前的企业级框架里介绍过,大家可以关注<我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器>,而今天主要对Lind.DDD.Caching进行更全 ...

最新文章

  1. 2021-08-08概率论与数理统计-第二章
  2. Flume TailDir 基本流程
  3. 极光推送(不定期更新)
  4. Stanford UFLDL教程 主成分分析(PCA)
  5. restTemplate的介绍和使用
  6. 洛谷P1420 最长连号
  7. 数组删除一行_一行Python代码能做出哪些神器的事情
  8. python基础——可变长参数
  9. python源码保护之cython
  10. java学生签到系统代码_java学生考勤签到代码【相关词_ 学生考勤系统java代码】...
  11. 轻量级微信动态活码生成管理源码
  12. 基于西门子S7-1200PLC的步进电机控制
  13. 手机滚动字幕软件java_提词器app下载
  14. 手把手教学使用图床,再也不需要重复上传照片到博客啦
  15. python美多商城一
  16. 语法基础——Objective-C语法基础
  17. 子类重写父类构造器以及其他方法
  18. ZSD018出货明细表
  19. 2022张宇考研基础30讲 第十五讲 数一数二专题
  20. 无刷直流电机自适应模糊PID控制及仿真

热门文章

  1. Winform窗体防抖动
  2. requests的深入刨析及封装调用
  3. 基于Gor实现流量复制(加middleware功能增强)
  4. windows无法连接到group policy client服务.此问题阻止标准用户登陆系统.
  5. 指针函数与函数指针的用法与区别
  6. (十七)Alian 的 Spring Cloud Eureka 集群配置(IP方式)
  7. python暑期实践8.4
  8. 【每日一练】105—CSS实现一款输入文本动画的效果
  9. JS 删除操作 delete
  10. python3 自定义排序函数_Python自定义排序函数