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

简介:

本文来自于实践中的不足

在最近开始过程中,遇到了一个问题,之前设计的工作单元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级别的事务里的,即最高的事务级别!

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

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.UoW~方法回调完成原子化操作,如需转载请自行联系原博主。

目录
相关文章
|
canal 消息中间件 存储
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(中)
803 0
|
3月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
41 0
|
3月前
|
存储 前端开发 JavaScript
PixiJS源码分析系列:第四章 响应 Pointer 交互事件(上篇)
PixiJS源码分析系列:第四章 响应 Pointer 交互事件(上篇)
|
5月前
|
存储 监控 Java
详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)
详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)
31 0
|
设计模式 架构师 数据建模
「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法
「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法
「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法
|
存储 JSON 前端开发
Android数据库存储模块封装,让操作记录更好用可复用
Android数据库存储模块封装,让操作记录更好用可复用
|
测试技术 持续交付 微服务
09 微服务接口:怎么用Mock解决混乱的调用关系?
09 微服务接口:怎么用Mock解决混乱的调用关系?
|
缓存 前端开发 JavaScript
基于 Observable 构建前端防腐策略
To B 业务的生命周期与迭代通常会持续多年,随着产品的迭代与演进,以接口调用为核心的前后端关系会变得非常复杂。在多年迭代后,接口的任何一处修改都可能给产品带来难以预计的问题。在这种情况下,构建更稳健的前端应用,保证前端在长期迭代下的稳健与可拓展性就变得非常重要。本文将重点介绍如何利用接口防腐策略避免或减少接口变更对前端的影响。
基于 Observable 构建前端防腐策略
|
存储 数据安全/隐私保护 微服务
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
484 0
DDD领域驱动设计实战(六)-理解领域事件(Domain Event)(上)
重复动作要封装,封装前找大家的共同特性或者说共同需求(例如都实现某个接口,都实现该接口的某个方法),然后利用这个共同特性封装起来
重复动作要封装,封装前找大家的共同特性或者说共同需求(例如都实现某个接口,都实现该接口的某个方法),然后利用这个共同特性封装起来
127 0