EF Core共享交易在这里是一个好的解决方案,还是一个错误的设计?

时间:2018-08-02 20:13:39

标签: c# entity-framework-core

设计:我有几个实体,每个实体都有自己的存储库,它们是EntityRepositories。还有另一个表示较高抽象度的存储库-我称它们为BusinessRepositories,其方法使用EntityRepositories。我背后的理由是,实体存储库代表原子的,可重用的实体级别的操作,并且易于测试。业务存储库代表业务价值,它基于可重复使用的,经过良好测试的原子操作建立,因此测试可以缩减,或者可以只关注业务价值,而不是不必要地多次执行原子实体级别的操作。我可能会对其进行过度设计,这是一个宠物项目。

我明白了需要在业务级别进行交易。我正在阅读shared transaction part of the doc,但无法弄清楚共享上下文是否适合我,或者我上述的设计是错误的。

该文档建议我可以将事务传递给EntityRepository,因此我可以执行以下操作。部分代码被复制粘贴,另一部分被键入,因此可能存在语法错误。

public class AEntityRepository : IAEntityRepository
    {
        private DbContextOptions _dbContextOptions;

        public AEntityRepository(DbContextOptions dbContextOptions)
        {
            _dbContextOptions = dbContextOptions;
        }

        public async Task<Dimension> ModifyAsync(
            Dimension entity,
            DbTransaction dbTransaction = null)
        {
            // stuff here
            using ( MasterDataContext ctx = new MasterDataContext(_dbContextOptions) )
            {
                ctx.Database.UseTransaction(dbTransaction.GetDbTransaction());
                // stuff here
            }
        }
}

public class BusinessRepository : IBusinessRepository
    {
        public async Task<BusinessObject> ModifyAsync(
            BusinessObject businessObject)
        {
            // stuff here
            using ( MasterDataContext ctx = new MasterDataContext(_dbContextOptions) )
            {
                using( var transaction = ctx.Database.BeginTransaction())
                {
                     try {
                         await _aEntityRepository.ModifyAsync(someObject, transaction.GetDbTransaction());
                         await _bEntityRepository.ModifyAsync(someObject, transaction.GetDbTransaction());
                         transaction.Commit();
                     } catch {
                         transaction.Rollback();
                     }
                }
            }
        }
}

在这种情况下的预期行为是,如果 _bEntityRepository.ModifyAsync()中出现问题,那么 _aEntityRepository.ModifyAsync()完成的操作也会回滚。 / p>

问题:我是在正确的道路上,还是我的设计是错误的?

0 个答案:

没有答案