この種の質問が何度も出されているにもかかわらず、リポジトリと作業単位のパターンの関係を理解するのに苦労しています。基本的に、どの部分がデータの変更を保存/コミットするのか、まだわかりません - リポジトリまたは作業単位ですか?
私が見たすべての例は、これらをデータベース/OR マッパーと組み合わせて使用することに関連しているため、より興味深い例を作成しましょう。データ ファイルでファイル システムにデータを永続化します。パターンによれば、データがどこに行くかは関係ないので、これを行うことができるはずです。
したがって、基本エンティティの場合:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
}
次のインターフェイスが使用されると思います。
public interface IAccountRepository
{
Account Get(int id);
void Add(Account account);
void Update(Account account);
void Remove(Account account);
}
public interface IUnitOfWork
{
void Save();
}
そして、使い方としては以下のようになると思います。
IUnitOfWork unitOfWork = // Create concrete implementation here
IAccountRepository repository = // Create concrete implementation here
// Add a new account
Account account = new Account() { Name = "Test" };
repository.Add(account);
// Commit changes
unitOfWork.Save();
すべてのデータがファイルに永続化されることを念頭に置いて、このデータを実際に追加/更新/削除するロジックはどこに行くのでしょうか?
Add()
、Update()
およびRemove()
メソッドを介してリポジトリに移動しますか? ファイルを読み書きするすべてのコードを 1 か所に配置するのは理にかなっているように思えますが、IUnitOfWork
インターフェイスのポイントは何でしょうか?IUnitOfWork
このシナリオでは、データ変更の追跡も担当しますか? 私には、これは、作業単位がファイルを書き込む必要があるときにリポジトリがファイルを読み取ることができるが、ロジックが 2 つの場所に分割されていることを示唆しています。