工作单元 + 存储库模式:业务事务概念的衰落
组合和是当今相当广泛使用的东西。正如 Martin Fowler 所说,使用的目的是形成一个商业交易,同时对存储库的实际工作方式一无所知(持续无知)。我已经回顾了许多实现;并忽略特定细节(具体/抽象类,接口,...),它们或多或少类似于以下内容:Unit of Work
Repository Pattern
UoW
public class RepositoryBase<T>
{
private UoW _uow;
public RepositoryBase(UoW uow) // injecting UoW instance via constructor
{
_uow = uow;
}
public void Add(T entity)
{
// Add logic here
}
// +other CRUD methods
}
public class UoW
{
// Holding one repository per domain entity
public RepositoryBase<Order> OrderRep { get; set; }
public RepositoryBase<Customer> CustomerRep { get; set; }
// +other repositories
public void Commit()
{
// Psedudo code:
For all the contained repositories do:
store repository changes.
}
}
现在我的问题:
UoW
公开公共方法 Commit
以存储更改。此外,由于每个存储库都有一个 共享实例 ,因此每个存储库都可以访问 UoW 上的方法。由一个存储库调用它会使所有其他存储库也存储其更改;因此,结果整个交易概念崩溃了:UoW
Repository
Commit
class Repository<T> : RepositoryBase<T>
{
private UoW _uow;
public void SomeMethod()
{
// some processing or data manipulations here
_uow.Commit(); // makes other repositories also save their changes
}
}
我认为这绝不能被允许。考虑到(业务事务)的目的,该方法应仅向启动业务事务(例如业务层)的人公开。令我惊讶的是,我找不到任何解决这个问题的文章。在所有这些中,都可以通过注入的任何存储库来调用。UoW
Commit
Commit
附言:我知道我可以告诉我的开发人员不要调用一个受信任的架构比受信任的开发人员更可靠!Commit
Repository