Lind.DDD.UoW工作单元的实现
回到目录
工作单元UoW我们几乎在任务一个像样的框架里都可以找到它的足迹,是的,对于大型系统来说,他是很重要的,保持数据一致性,维持事务状态这都是它要为系统实现的功能,而在不同的框架里,实现UoW的机制也是不同的,在Lind.DDD中,采用了一种共同注册,统一提交的方式来实现UoW!
UoW结构图
我们来看一下大叔工作单元的代码实现,首先看一下IUnitOfWorkRepository,我们的仓储接口会实现它,以便之后我们的仓储对象可以添加到工作单元里
/// <summary>/// 工作单元中仓储接口CRUD操作/// 需要使用工作单元的仓储,需要实现本接口(IRepository,IExtensionRepository)/// </summary>public interface IUnitOfWorkRepository{/// <summary>/// 添加实体/// </summary>/// <param name="item"></param>void UoWInsert(IEntity item);/// <summary>/// 更新实体/// </summary>/// <param name="item"></param>void UoWUpdate(IEntity item);/// <summary>/// 移除实体/// </summary>/// <param name="item"></param>void UoWDelete(IEntity item);}
接下来,我们再来说一下IUnitOfWork接口,它是工作单元入口的接口,有添加到单元和提交单元两个方法,使用简单明了,内部有字典对象,用来存储要提交的操作,这也是工作单元的核心,IEntity是实体的标识接口,所有实体都要继承它,而IUnitOfWorkRepository是仓储的标识接口,所以仓储接口都要继承它。
/// <summary>/// 工作单元/// 所有数据上下文对象都应该继承它,面向仓储的上下文应该与具体实现(存储介质,ORM)无关/// </summary>public interface IUnitOfWork{/// <summary>/// 向工作单元中注册变更/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <param name="type"></param>/// <param name="repository"></param>void RegisterChangeded(IEntity entity, SqlType type, IUnitOfWorkRepository repository);/// <summary>/// 向数据库提交变更/// </summary>void Commit();}
我们来看一下,大叔是如何实现IUnitOfWork接口的吧
/// <summary>/// 工作单元,主要用于管理事务性操作/// Author:Lind.zhang/// </summary>public class UnitOfWork : IUnitOfWork{#region Fields/// <summary>/// 操作行为字典/// </summary>private IDictionary<IEntity, IUnitOfWorkRepository> insertEntities;private IDictionary<IEntity, IUnitOfWorkRepository> updateEntities;private IDictionary<IEntity, IUnitOfWorkRepository> deleteEntities;#endregion#region Constructorpublic UnitOfWork(){insertEntities = new Dictionary<IEntity, IUnitOfWorkRepository>();updateEntities = new Dictionary<IEntity, IUnitOfWorkRepository>();deleteEntities = new Dictionary<IEntity, IUnitOfWorkRepository>();}#endregion#region IUnitOfWork 成员/// <summary>/// 事务提交/// </summary>public void Commit(){try{using (TransactionScope transactionScope = new TransactionScope()){foreach (var entity in insertEntities.Keys){insertEntities[entity].UoWInsert(entity);}foreach (var entity in updateEntities.Keys){updateEntities[entity].UoWUpdate(entity);}foreach (var entity in deleteEntities.Keys){deleteEntities[entity].UoWDelete(entity);}transactionScope.Complete();//提交事务,程序中如果出错,这行无法执行,即事务不会被提交,这就类似于rollback机制 }}catch (Exception ex){Logger.LoggerFactory.Instance.Logger_Error(ex);}}/// <summary>/// 注册数据变更/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <param name="type"></param>public void RegisterChangeded(IEntity entity, SqlType type, IUnitOfWorkRepository repository){switch (type){case SqlType.Insert:insertEntities.Add(entity, repository);break;case SqlType.Update:updateEntities.Add(entity, repository);break;case SqlType.Delete:deleteEntities.Add(entity, repository);break;default:throw new ArgumentException("you enter reference is error.");}}#endregion}
工作单元在调用时也是非常方便的,两步完成,第一注意动作,第二提交事务,下面看一下DEMO的代码片断
unitOfWork.RegisterChangeded(entity, SqlType.Update, userRepository);var userExtension = userExtRepository.Find(entity.Id);userExtension.NickName = Request.Form["UserExtension.NickName"];userExtension.School = Request.Form["UserExtension.School"];unitOfWork.RegisterChangeded(userExtension, SqlType.Update, userExtRepository);unitOfWork.Commit();
OK,对于工作单元的探讨今天就先说到这里,以后肯定还是机会去研究的!
回到目录
转载于:https://www.cnblogs.com/lori/p/5083710.html
Lind.DDD.UoW工作单元的实现相关推荐
- Lind.DDD.UoW~方法回调完成原子化操作
回到目录 本文来自于实践中的不足 在最近开始过程中,遇到了一个问题,之前设计的工作单元UoW只支持Insert,Update,Delete三种操作,即开发人员可以将以上三种操作同时扔进工作单元,由工作 ...
- Lind.DDD敏捷领域驱动框架~介绍
最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...
- 如何运用领域驱动设计 - 工作单元
概述 在上一篇 <如何运用领域驱动设计 - 存储库> 的文章中,我们讲述了有关仓储的概念和使用规范.仓储为聚合提供了持久化到本地的功能,但是在持久化的过程中,有时一个聚合根中的各个领域对象 ...
- Asp.Net Core 工作单元 UnitOfWork UOW
Asp.Net Core 工作单元示例 来自 ABP UOW 去除所有无用特性 代码下载 : 去除所有无用特性版本,原生AspNetCore实现 差不多 2278 行代码: 链接:https://pa ...
- 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍
回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...
- [Abp vNext 源码分析] - 4. 工作单元
一.简要说明 统一工作单元是一个比较重要的基础设施组件,它负责管理整个业务流程当中涉及到的数据库事务,一旦某个环节出现异常自动进行回滚处理. 在 ABP vNext 框架当中,工作单元被独立出来作为一 ...
- ABP理论学习之工作单元(Unit of Work)
本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IReposito ...
- 使用ASP.NET核心应用程序实现存储库模式和工作单元的指南
目录 介绍 存储库模式 优点 隔离数据访问逻辑 单元测试 高速缓存 数据源迁移 复杂查询被封装 实现的经验法则 项目结构 依赖注入(DI) DI的优点 使用代码 数据访问层 工作单位(UOW) 业务层 ...
最新文章
- 报错解决transmission: Error: Input/Output error和ls: reading directory '': Input/output error
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
- TDEngine数据包的详细说明
- 基于ASP.NET Core 3.0的ABP v0.21已发布
- Python+Selenium自动化篇-5-获取页面信息
- redis命令参考string---MSETNX
- MLOps- 吴恩达Andrew Ng Data Definition and Baseline Week3 实验作业
- Qt中QListView设置其编辑状态
- supergo定位软件_super go定位修改下载
- 托福学习计划留学考研
- Python画樱花树~
- python第一次操作ES The client noticed that the server is not Elasticsearch and we do not support this unk
- Trace32 simulator调试以及简单实用命令介绍
- Git 进行分布式管理的入门
- 疯狂模渲大师链接永久是最新版|怎么安装客户端并激活素材库联系作者加载自营专属素材扩展包高效使用超一流辅助插件脚本工具的步骤教程?...
- Xcode更新不了的解决办法
- 拉黑的微信好友怎么恢复,拉黑的微信好友聊天记录还在吗
- shell 命令下载软件 安装软件
- 【批量解压d文件】d文件是GNSS观测数据文件
- 交换机与路由器技术:VLAN Trunk、单臂路由和三层交换及配置