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级别的事务里的,即最高的事务级别!
对于知识的总结与研究很重要,有时,我们对一个事物一定要有较真的精神,我经常这样对我儿子说,学英语,一定要较真!
感谢各位的阅读!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2015-06-24 MongoDB学习笔记~管道中的分组实现group+distinct
2013-06-24 品味人生~咖啡与程序员
2012-06-24 说说设计模式~简单工厂模式(Factory)
2012-06-24 说说设计模式~单件模式(Singleton)
2011-06-24 JS函数的原型及对象,对象方法,对象属性的学习