using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Transactions; using UnitOfWork; namespace UnitOfWork { public interface IUnitOfWorkRepository { void NewItem(object item); void UpdatedItem(object item); void DeletedItem(object item); } public interface IUnitOfWork { void RegisterAdded(object entity, IUnitOfWorkRepository repository); void RegisterChanged(object entity, IUnitOfWorkRepository repository); void RegisterRemoved(object entity, IUnitOfWorkRepository repository); void Commit(); } public class UnitOfWork : IUnitOfWork { private Dictionary<object, IUnitOfWorkRepository> addedEntities; private Dictionary<object, IUnitOfWorkRepository> changedEntities; private Dictionary<object, IUnitOfWorkRepository> deletedEntities; ///<summary> /// 实例化工作单元 ///</summary> public UnitOfWork() { this.addedEntities = new Dictionary<object, IUnitOfWorkRepository>(); this.changedEntities = new Dictionary<object, IUnitOfWorkRepository>(); this.deletedEntities = new Dictionary<object, IUnitOfWorkRepository>(); } #region IUnitOfWork 方法 ///<summary> /// 注册添加操作 ///</summary> ///<param name="entity"></param> ///<param name="repository"></param> public void RegisterAdded(object entity, IUnitOfWorkRepository repository) { this.addedEntities.Add(entity, repository); } ///<summary> /// 注册更改操作 ///</summary> ///<param name="entity"></param> ///<param name="repository"></param> public void RegisterChanged(object entity, IUnitOfWorkRepository repository) { this.changedEntities.Add(entity, repository); } ///<summary> /// 注册删除操作 ///</summary> ///<param name="entity"></param> ///<param name="repository"></param> public void RegisterRemoved(object entity, IUnitOfWorkRepository repository) { this.deletedEntities.Add(entity, repository); } ///<summary> /// 执行内存列表保存的操作 ///</summary> public void Commit() { using (TransactionScope scope = new TransactionScope()) { foreach (object entity in this.deletedEntities.Keys) { this.deletedEntities[entity].DeletedItem(entity); } foreach (object entity in this.addedEntities.Keys) { this.addedEntities[entity].NewItem(entity); } foreach (object entity in this.changedEntities.Keys) { this.changedEntities[entity].UpdatedItem(entity); } scope.Complete(); } this.deletedEntities.Clear(); this.addedEntities.Clear(); this.changedEntities.Clear(); } #endregion } public class TestRepository : IUnitOfWorkRepository { private IUnitOfWork unitOfWork; private IUnitOfWork TestUnitOfWork { get { return this.unitOfWork; } } public TestRepository(IUnitOfWork unitOfWork) { this.unitOfWork = unitOfWork; } public void Add(object _object) { TestUnitOfWork.RegisterAdded(_object, this); Console.WriteLine("注册添加数据" + _object); } public void Delete(object _object) { TestUnitOfWork.RegisterRemoved(_object, this); Console.WriteLine("注册删除数据" + _object); } public void update(object _object) { TestUnitOfWork.RegisterChanged(_object, this); Console.WriteLine("注册更新数据" + _object); } public void NewItem(object _object) { Console.WriteLine("执行添加数据" + _object); } public void UpdatedItem(object _object) { Console.WriteLine("执行更新数据" + _object); } public void DeletedItem(object _object) { Console.WriteLine("执行删除数据" + _object); } } public class TestServer { private static IUnitOfWork unitOfWork; private static TestRepository _TestRepository; static TestServer() { TestServer.unitOfWork = new UnitOfWork(); _TestRepository = new TestRepository(unitOfWork); } public static void Add() { _TestRepository.Add(1); _TestRepository.Add(2); _TestRepository.Add(3); _TestRepository.Add(4); _TestRepository.Add(5); unitOfWork.Commit(); } public static void Add(object _object) { _TestRepository.Add(_object); _TestRepository.Delete(_object); _TestRepository.update(_object); unitOfWork.Commit(); } public static void Delete(object _object) { _TestRepository.Delete(_object); unitOfWork.Commit(); } public static void Update(object _object) { _TestRepository.update(_object); unitOfWork.Commit(); } } } namespace ConsoleApplication3 { class Program { static void Main(string[] args) { TestServer.Add(1); Console.WriteLine("----------------------------"); TestServer.Add(); Console.ReadKey(); } } }