/// <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; } }
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); }
/// <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; } }
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(); } } }
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); }