设计:我有几个实体,每个实体都有自己的存储库,它们是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>
问题:我是在正确的道路上,还是我的设计是错误的?