public static T RunInScope <T>(Func <T> function) { if (function == null) { throw new ArgumentNullException("function"); } using (UnityContainerScope scope = UnityContainerScope.NewScope()) { return(function.Invoke()); } }
public static void RunInScope(Action action) { if (action == null) { throw new ArgumentNullException("action"); } using (UnityContainerScope scope = UnityContainerScope.NewScope()) { action.Invoke(); } }
public static IUnityContainer GetContainer() { int key = Thread.CurrentThread.ManagedThreadId; if (!UnityContainerScope.InScope(key)) { throw new UnityContainerNotInScopeException( string.Format(CultureInfo.InvariantCulture, "The specified scope id [{0}] is not in scope.", key)); } if (!containerMapping.ContainsKey(key)) { BuildUpContainer(key); } return(containerMapping.Get(key)); }
static void Main(string[] args) { IUnityContainer container = new UnityContainer() .RegisterType(typeof(IRepository <>), typeof(Repository <>), new HierarchicalLifetimeManager()) .RegisterType <IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager()) .RegisterType <DbContext, RETAILContext>(new HierarchicalLifetimeManager()) .RegisterType <DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectSetFactory, DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectContext, DbContextAdapter>(new HierarchicalLifetimeManager()); UnityContainerDispatcher.InjectParentContainer(container); Mapper.CreateMap <DomainModels.Customer, Customer>(); Mapper.CreateMap <Customer, DomainModels.Customer>(); // =============== 测试事务回滚 =============== Console.ForegroundColor = ConsoleColor.Red; DomainModels.Customer customer1 = new DomainModels.Customer() { Name = "Dennis Gao", Address = "Beijing", Phone = "18888888888", }; DomainModels.Customer customer2 = new DomainModels.Customer() { //Name = null, // 创造一个无效的对象,此处客户名称不能为空 Address = "Beijing", Phone = "16666666666", }; try { using (var transactionScope = new TransactionScope( TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) { using (UnityContainerScope scope = UnityContainerScope.NewScope()) { Customer entity1 = Mapper.Map <DomainModels.Customer, Customer>(customer1); Customer entity2 = Mapper.Map <DomainModels.Customer, Customer>(customer2); Repository.Customers.Insert(entity1); Repository.Customers.Insert(entity2); Repository.Commit(); customer1.Id = entity1.Id; customer2.Id = entity2.Id; } transactionScope.Complete(); } } catch (Exception ex) { Console.WriteLine(FlattenException(ex)); } Console.WriteLine(customer1); Console.WriteLine(customer2); Console.WriteLine("====================================="); // =============== 查询回滚结果 =============== List <DomainModels.Customer> customers = new List <DomainModels.Customer>(); using (var transactionScope = new TransactionScope( TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) { using (UnityContainerScope scope = UnityContainerScope.NewScope()) { List <Customer> entities = Repository.Customers.Query().ToList(); foreach (var entity in entities) { DomainModels.Customer customer = Mapper.Map <Customer, DomainModels.Customer>(entity); customers.Add(customer); } } transactionScope.Complete(); } foreach (var customer in customers) { Console.WriteLine(customer); } // =============== 清理 =============== Console.WriteLine(); Console.WriteLine("Press any key to clean database..."); Console.ReadKey(); using (UnityContainerScope scope = UnityContainerScope.NewScope()) { List <Customer> entities1 = Repository.Customers.Query().ToList(); foreach (var entity in entities1) { Repository.Customers.Delete(entity); } Repository.Commit(); } }
static void Main(string[] args) { IUnityContainer container = new UnityContainer() .RegisterType(typeof(IRepository <>), typeof(Repository <>), new HierarchicalLifetimeManager()) .RegisterType <IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager()) .RegisterType <DbContext, RETAILContext>(new HierarchicalLifetimeManager()) .RegisterType <DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectSetFactory, DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectContext, DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <ICustomerRepository, CustomerRepository>(new HierarchicalLifetimeManager()); UnityContainerDispatcher.InjectParentContainer(container); Mapper.CreateMap <DomainModels.Customer, Customer>(); Mapper.CreateMap <Customer, DomainModels.Customer>(); Mapper.CreateMap <DomainModels.Supplier, Supplier>(); Mapper.CreateMap <Supplier, DomainModels.Supplier>(); ICustomerRepository customerRepository = container.Resolve <ICustomerRepository>(); // =============== 增 =============== Console.ForegroundColor = ConsoleColor.DarkRed; DomainModels.Customer customer1 = new DomainModels.Customer() { Name = "Dennis Gao", Address = "Beijing", Phone = "18888888888", }; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { Customer entity = Mapper.Map <DomainModels.Customer, Customer>(customer1); Repository.Customers.Insert(entity); Repository.Commit(); customer1.Id = entity.Id; } Console.WriteLine(customer1); DomainModels.Customer customer2 = new DomainModels.Customer() { Name = "Degang Guo", Address = "Beijing", Phone = "16666666666", }; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { Customer entity = Mapper.Map <DomainModels.Customer, Customer>(customer2); Repository.Customers.Insert(entity); Repository.Commit(); customer2.Id = entity.Id; } Console.WriteLine(customer2); DomainModels.Supplier supplier1 = new DomainModels.Supplier() { CompanyName = "Microsoft", Address = "Beijing", ContactName = "Bill Gates", ContactTitle = "CEO", }; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { Supplier entity = Mapper.Map <DomainModels.Supplier, Supplier>(supplier1); Repository.Suppliers.Insert(entity); Repository.Commit(); supplier1.Id = entity.Id; } Console.WriteLine(supplier1); // =============== 事务 =============== Console.ForegroundColor = ConsoleColor.Green; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { customer1.Address = Guid.NewGuid().ToString(); customer2.Address = Guid.NewGuid().ToString(); supplier1.ContactName = "Steven Ballmer"; Customer entity1 = Mapper.Map <DomainModels.Customer, Customer>(customer1); Customer entity2 = Mapper.Map <DomainModels.Customer, Customer>(customer2); Supplier entity3 = Mapper.Map <DomainModels.Supplier, Supplier>(supplier1); Repository.Customers.Update(entity1); // good, we are in same transaction Repository.Customers.Update(entity2); // good, we are in same transaction Repository.Suppliers.Update(entity3); // good, we are in same transaction Repository.Commit(); } // =============== 清理 =============== Console.WriteLine(); Console.WriteLine("Press any key to clean database..."); Console.ReadKey(); using (UnityContainerScope scope = UnityContainerScope.NewScope()) { List <Customer> entities1 = Repository.Customers.Query().ToList(); List <Supplier> entities2 = Repository.Suppliers.Query().ToList(); foreach (var entity in entities1) { Repository.Customers.Delete(entity); } foreach (var entity in entities2) { Repository.Suppliers.Delete(entity); } Repository.Commit(); } }
static void Main(string[] args) { IUnityContainer container = new UnityContainer() .RegisterType(typeof(IRepository <>), typeof(Repository <>), new HierarchicalLifetimeManager()) .RegisterType <IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager()) .RegisterType <DbContext, RETAILContext>(new HierarchicalLifetimeManager()) .RegisterType <DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectSetFactory, DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <IObjectContext, DbContextAdapter>(new HierarchicalLifetimeManager()) .RegisterType <ICustomerRepository, CustomerRepository>(new HierarchicalLifetimeManager()); UnityContainerDispatcher.InjectParentContainer(container); ICustomerRepository customerRepository = container.Resolve <ICustomerRepository>(); // =============== 增 =============== Console.ForegroundColor = ConsoleColor.DarkRed; DomainModels.Customer customer1 = new DomainModels.Customer() { Name = "Dennis Gao", Address = "Beijing", Phone = "18888888888", }; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { customerRepository.InsertCustomer(customer1); } Console.WriteLine(customer1); DomainModels.Customer customer2 = new DomainModels.Customer() { Name = "Degang Guo", Address = "Beijing", Phone = "16666666666", }; using (UnityContainerScope scope = UnityContainerScope.NewScope()) { customerRepository.InsertCustomer(customer2); } Console.WriteLine(customer2); // =============== 并发 =============== Console.ForegroundColor = ConsoleColor.Green; Mapper.CreateMap <DomainModels.Customer, DomainModels.Customer>(); List <Task> tasks = new List <Task>(); for (int i = 0; i < 16; i++) { DomainModels.Customer modifiedCustomer = Mapper.Map <DomainModels.Customer, DomainModels.Customer>(customer1); modifiedCustomer.Name = modifiedCustomer.Name + i; Task t = Task.Factory.StartNew(() => { try { using (UnityContainerScope scope = UnityContainerScope.NewScope()) { customerRepository.UpdateCustomer(modifiedCustomer); Console.WriteLine("Modified " + modifiedCustomer.Name + " in thread " + Thread.CurrentThread.ManagedThreadId); } } catch (Exception ex) { Console.WriteLine("Exception occurred in thread " + Thread.CurrentThread.ManagedThreadId); Console.WriteLine(ex.Message); } }); tasks.Add(t); } Task.WaitAll(tasks.ToArray()); // =============== 清理 =============== Console.WriteLine(); Console.WriteLine("Press any key to clean database..."); Console.ReadKey(); using (UnityContainerScope scope = UnityContainerScope.NewScope()) { customerRepository.DeleteAllCustomers(); } }