回到目录
本文来自于实践中的不足
在最近开始过程中,遇到了一个问题,之前设计的工作单元UoW只支持Insert,Update,Delete三种操作,即开发人员可以将以上三种操作同时扔进工作单元,由工作单元UoW负责事件的处理,这种设计已经出现很多年了,大叔感觉也是不错,思路就是在工作单元里添加三个字典对象,用来存储你的Insert,Update,Delete操作,然后在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级别的事务里的,即最高的事务级别!