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));
        }
Пример #4
0
        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();
            }
        }