Esempio n. 1
0
        public async Task ChildUow_TransactionOperationWillDelayedtoParent_Async()
        {
            var provider = GetServiceProvider(AddScopeTransactionProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create())
            {
                using (var uow2 = uowManager.Create())
                {
                    await uow2.TryAddDbExecutorAsync(currentDbExecutor);

                    //当前会具有外围的事务
                    Assert.True(currentDbExecutor.HasTransaction);

                    await uow2.SaveChangesAsync();
                }

                //虽然在uow2之外,但是由于使用了子uow,所以此时也不会被uow2释放
                Assert.False(currentDbExecutor.IsDispose);

                await uow.SaveChangesAsync();
            }

            //uow结束,则uow2包含的操作也将释放
            Assert.True(currentDbExecutor.IsDispose);
        }
Esempio n. 2
0
        public async Task MoreProvider_CannotReused_Async()
        {
            var provider = GetServiceProvider(AddTwoSameTypeProvider);

            var uowManager         = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor  = new ScopeDbExecutor(new FakeDbContext());
            var currentDbExecutor2 = new DemoDbExecutor(new DemoDbContext());

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //此时工作单元中已经有一个事务,但是由于类型不同currentDbExecutor2不能复用
                await uow.TryAddDbExecutorAsync(currentDbExecutor2);

                Assert.True(currentDbExecutor.HasTransaction);
                Assert.False(currentDbExecutor2.HasTransaction);

                await uow.SaveChangesAsync();
            }

            //但是会被添加到工作单元,最后于工作单元一同释放
            Assert.True(currentDbExecutor.IsDispose);
            Assert.True(currentDbExecutor2.IsDispose);
        }
Esempio n. 3
0
        public async Task MoreProvider_CanReused_Async()
        {
            var provider = GetServiceProvider(AddTwoSameTypeProvider);

            var uowManager         = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor  = new ScopeDbExecutor(new FakeDbContext());
            var currentDbExecutor2 = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //此时工作单元中已经有一个事务,同一类型的执行对象可以复用已有事务
                await uow.TryAddDbExecutorAsync(currentDbExecutor2);

                Assert.True(currentDbExecutor.HasTransaction);
                Assert.True(currentDbExecutor2.HasTransaction);


                //currentDbExecutor2的事务来源是上一个事务
                var transactionObj = currentDbExecutor2.TransactionObject as TestScopeTransactionObject;
                Assert.NotNull(transactionObj);
                Assert.Equal("TestScope", transactionObj.Source);

                await uow.SaveChangesAsync();
            }

            //但是会被添加到工作单元,最后于工作单元一同释放
            Assert.True(currentDbExecutor.IsDispose);
            Assert.True(currentDbExecutor2.IsDispose);
        }
Esempio n. 4
0
        public async Task UnitOfWork_NoAnyProvider_DbContextManualDispose_Async()
        {
            //没有事务支持程序
            var provider   = GetServiceProvider();
            var uowManager = provider.GetService <IUnitOfWorkManager>();

            FakeDbContext   fakeDbContext;
            ScopeDbExecutor fakeDbExecutor;

            using (var uow = uowManager.Create())
            {
                using (var dbContext = new FakeDbContext())
                {
                    fakeDbContext = dbContext;

                    fakeDbExecutor = new ScopeDbExecutor(dbContext);

                    await uow.TryAddDbExecutorAsync(fakeDbExecutor);

                    await uow.SaveChangesAsync();

                    Assert.False(fakeDbExecutor.HasTransaction);
                    Assert.False(fakeDbContext.IsDispose);
                }
                //手动释放了dbcontext;
                Assert.True(fakeDbContext.IsDispose);
            }
            //dbContext还会在工作单元释放时被释放,但是不会报错。
            Assert.True(fakeDbContext.IsDispose);
        }
Esempio n. 5
0
        public async Task ChildUnitOfWorkEvent_WillTrigger_Async()
        {
            var provider = GetServiceProvider(AddScopeTransactionProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            string saveChangedInfo = "";
            string rollbackInfo    = "";
            string disposeInfo     = "";

            var options = new UnitOfWorkOptions();

            options.Events.OnCompleted += s =>
            {
                saveChangedInfo = "over";
                return(Task.CompletedTask);
            };
            options.Events.OnRollbacked += s =>
            {
                rollbackInfo = "over";
                return(Task.CompletedTask);
            };
            options.Events.OnDispose += s =>
            {
                disposeInfo = "over";
                return(Task.CompletedTask);
            };

            using (var uow = uowManager.Create())
            {
                using (var uow2 = uowManager.Create(options))
                {
                    await uow2.TryAddDbExecutorAsync(currentDbExecutor);

                    await uow2.SaveChangesAsync();

                    await uow2.RollbackAsync();
                }
            }

            Assert.Equal("over", saveChangedInfo);
            Assert.Equal("over", rollbackInfo);
            Assert.Equal("over", disposeInfo);

            //uow结束,则uow2包含的操作也将释放
            Assert.True(currentDbExecutor.IsDispose);
        }
Esempio n. 6
0
        public async Task SuppressOption_ExecutorBeEntrusted_AndNotOpenTransaction_Async()
        {
            var provider = GetServiceProvider(AddScopeTransactionProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create(UnitOfWorkScope.Suppress))
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //Provider接受了当前Executor,但是由于Suppress配置,所以不会为该对象开启事务
                Assert.False(currentDbExecutor.HasTransaction);

                await uow.SaveChangesAsync();
            }

            Assert.True(currentDbExecutor.IsDispose);
        }
Esempio n. 7
0
        public async Task AlreadyHasTransactionExecutor_ShouldNotCreateNewTrsansation_Async()
        {
            var provider = GetServiceProvider(AddScopeTransactionProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());
            //在托管给uow之前就已经具有了事务
            var transaScope = new TransactionScope();
            await currentDbExecutor.UseTransactionAsync(new TestScopeTransactionObject(transaScope));

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                await uow.SaveChangesAsync();
            }

            transaScope.Dispose();//由于是外界的事务,所以uow不会托管该事务,需要手动释放

            Assert.True(currentDbExecutor.IsDispose);
        }
Esempio n. 8
0
        public async Task MoreProvider_UseSuitableProvider_Async()
        {
            var provider = GetServiceProvider(AddTwoDifferentTypeProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //具有多个Provider,但是它只会接受TestScopeTransactionProvider
                Assert.True(currentDbExecutor.HasTransaction);
                Assert.IsType <TransactionScope>(currentDbExecutor.DbOjectInstance.Trsansaction);

                await uow.SaveChangesAsync();
            }

            Assert.True(currentDbExecutor.IsDispose);
            Assert.Null(Transaction.Current);
        }
Esempio n. 9
0
        public void UnitOfWork_NoAnyProvider()
        {
            //没有事务支持程序
            var provider = GetServiceProvider();

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var dbContext         = new FakeDbContext();
            var currentDbExecutor = new ScopeDbExecutor(dbContext);

            using (var uow = uowManager.Create())
            {
                uow.TryAddDbExecutor(currentDbExecutor);
                uow.SaveChanges();

                Assert.False(currentDbExecutor.HasTransaction);
            }

            //没有事务提供程序,但是该操作对象还是会被托管释放
            Assert.True(currentDbExecutor.IsDispose);
            Assert.True(dbContext.IsDispose);
        }
Esempio n. 10
0
        public async Task UnitOfWork_OnlyOneProvider_CanCreate_Async()
        {
            var provider = GetServiceProvider(AddScopeTransactionProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //Provider接受了当前Executor,并且开启了事务
                Assert.True(currentDbExecutor.HasTransaction);
                //使用TransactionScope时,将会开启一个当前事务
                Assert.NotNull(Transaction.Current);

                await uow.SaveChangesAsync();
            }

            Assert.True(currentDbExecutor.IsDispose);
            Assert.Null(Transaction.Current);
        }
Esempio n. 11
0
        public async Task MoreSuitableProvider_UseOrderLowest_Async()
        {
            var provider = GetServiceProvider(AddTwoSameTypeProvider);

            var uowManager        = provider.GetService <IUnitOfWorkManager>();
            var currentDbExecutor = new ScopeDbExecutor(new FakeDbContext());

            using (var uow = uowManager.Create())
            {
                await uow.TryAddDbExecutorAsync(currentDbExecutor);

                //具有多个同类型的Provider,但是它只会接受TestScopeTransactionProvider
                var transactionObj = currentDbExecutor.TransactionObject as TestScopeTransactionObject;

                Assert.NotNull(transactionObj);
                Assert.Equal("TestScope", transactionObj.Source);

                await uow.SaveChangesAsync();
            }

            Assert.True(currentDbExecutor.IsDispose);
            Assert.Null(Transaction.Current);
        }