Esempio n. 1
0
        /// <summary>
        /// UnitOfWork联合提交(包含处理领域事件)扩展方法
        /// </summary>
        /// <param name="unitOfWork">工作单元实例</param>
        public static void UnitedCommit(this IUnitOfWork unitOfWork)
        {
            try
            {
                //开启事务
                using (TransactionScope scope = new TransactionScope())
                {
                    //提交工作单元
                    unitOfWork.Commit();

                    //处理领域事件
                    EventMediator.HandleUncompletedEvents();

                    //事务完成
                    scope.Complete();
                }
            }
            catch
            {
                //不参与事务
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
                {
                    //回滚工作单元
                    unitOfWork.RollBack();

                    //清空未处理的领域事件
                    EventMediator.ClearUncompletedEvents();

                    //事务完成
                    scope.Complete();
                }
                throw;
            }
        }
Esempio n. 2
0
        public void CreateProduct()
        {
            const int runCount = 1000;

            IList <Guid> sessionIds = new List <Guid>();

            Parallel.For(0, runCount, i =>
            {
                using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    Initializer.InitSessionId();
                    sessionIds.Add(GlobalSetting.CurrentSessionId);

                    Product product = new Product(i.ToString(), "测试商品" + i, 19);

                    EventMediator.HandleUncompletedEvents();

                    //断言会触发领域事件,并修改目标参数的值
                    Assert.IsTrue(ProductCreatedEventHandler.ProductName.Value == product.Name);
                    Assert.IsTrue(ServiceCreatedEventHandler.ServiceName.Value == product.Name);

                    scope.Complete();
                }
            });

            Assert.IsTrue(sessionIds.Count == runCount);
            Assert.IsTrue(sessionIds.Distinct().Count() == runCount);
        }
Esempio n. 3
0
        /// <summary>
        /// UnitOfWork集联合提交(包含处理领域事件)扩展方法
        /// </summary>
        /// <param name="unitOfWorks">工作单元实例集</param>
        public static void UnitedCommit(this IEnumerable <IUnitOfWork> unitOfWorks)
        {
            #region # 验证参数

            if (unitOfWorks == null)
            {
                throw new ArgumentNullException("unitOfWorks", "工作单元实例集不可为空!");
            }

            #endregion

            unitOfWorks = unitOfWorks.ToArray();

            try
            {
                //开启事务
                using (TransactionScope scope = new TransactionScope())
                {
                    foreach (IUnitOfWork unitOfWork in unitOfWorks)
                    {
                        //提交工作单元
                        unitOfWork.Commit();
                    }

                    //处理领域事件
                    EventMediator.HandleUncompletedEvents();

                    //事务完成
                    scope.Complete();
                }
            }
            catch
            {
                //不参与事务
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
                {
                    //回滚工作单元
                    foreach (IUnitOfWork unitOfWork in unitOfWorks)
                    {
                        //提交工作单元
                        unitOfWork.Commit();
                    }

                    //清空未处理的领域事件
                    EventMediator.ClearUncompletedEvents();

                    //事务完成
                    scope.Complete();
                }
                throw;
            }
        }
        /// <summary>
        /// 工作单元联合处理领域事件提交
        /// </summary>
        /// <param name="unitOfWork">工作单元实例</param>
        /// <remarks>采用本地事务</remarks>
        public static void UnitedCommit(this IUnitOfWork unitOfWork)
        {
            try
            {
                if (unitOfWork.GetCurrentTransaction() == null)
                {
                    using (DbTransaction dbTransaction = unitOfWork.BeginTransaction())
                    {
                        //提交工作单元
                        unitOfWork.Commit();

                        //处理领域事件
                        EventMediator.HandleUncompletedEvents();

                        //提交事务
                        dbTransaction.Commit();
                    }
                }
                else
                {
                    //提交工作单元
                    unitOfWork.Commit();

                    //处理领域事件
                    EventMediator.HandleUncompletedEvents();
                }
            }
            catch
            {
                //不参与事务
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, AsyncFlowOption))
                {
                    //回滚工作单元
                    unitOfWork.RollBack();

                    //清空未处理的领域事件
                    EventMediator.ClearUncompletedEvents();

                    //事务完成
                    scope.Complete();
                }
                throw;
            }
        }
Esempio n. 5
0
        public void CreateProduct()
        {
            for (int i = 0; i < 100; i++)
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    Initializer.InitSessionId();

                    Product product = new Product(i.ToString(), "测试商品" + i, 19);

                    EventMediator.HandleUncompletedEvents();

                    //断言会触发领域事件,并修改目标参数的值
                    Assert.IsTrue(ProductCreatedEventHandler.ProductName == product.Name);
                    Assert.IsTrue(ProductCreatedEvent2Handler.ProductName == product.Name);

                    scope.Complete();
                }
            }
        }
Esempio n. 6
0
        public void TestCreateOrder()
        {
            const int runCount = 1000;

            IList <Guid> sessionIds = new List <Guid>();

            for (int i = 0; i < runCount; i++)
            {
                using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    GlobalSetting.InitCurrentSessionId();
                    sessionIds.Add(GlobalSetting.CurrentSessionId);

                    Order order = new Order(i.ToString(), "测试单据" + i);
                    order.Check();

                    EventMediator.HandleUncompletedEvents();
                    scope.Complete();
                }
            }

            Assert.IsTrue(sessionIds.Count == runCount);
            Assert.IsTrue(sessionIds.Distinct().Count() == runCount);
        }