と を組み合わせることは、現在かなり広く使用されているものですUnit of Work
。Repository Pattern
Martin Fowlerが言うように、使用の目的は、リポジトリが実際にどのように機能するかを知らずに (永続的に無知である) 、ビジネス トランザクション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
変更を保存する public メソッドを公開します。また、各リポジトリには の共有インスタンスがあるためUoW
、それぞれがUoW 上のRepository
メソッドにアクセスできます。Commit
1 つのリポジトリから呼び出すと、他のすべてのリポジトリにも変更が保存されます。したがって、結果として、トランザクションの概念全体が崩壊します。
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
PS:Commit
開発者に電話をかけないように言うことはできますRepository
が、信頼できるアーキテクチャは信頼できる開発者よりも信頼できます。