現在、作業中のリポジトリ パターンを実装しています。すべてのリポジトリは独自のインターフェイスの背後にあり、Ninject を介してマッピングされます。私たちのプロジェクトは非常に大きく、解決しようとしているこのパターンにはいくつかの癖があります。
まず、10 個から 15 個以上のリポジトリがすべて同じコントローラーに必要なコントローラーがいくつかあります。非常に多くのリポジトリを要求すると、コンストラクターはかなり醜くなります。2 番目の癖は、複数のリポジトリでメソッドを呼び出した後に明らかになります。複数のリポジトリで作業を行った後、SaveChanges メソッドを呼び出す必要がありますが、どのリポジトリで呼び出す必要があるでしょうか? すべてのリポジトリに 1 つあります。すべてのリポジトリには、挿入された Entity Framework データ コンテキストの同じインスタンスがあるため、任意のリポジトリをランダムに選択して保存を呼び出すことができます。とても面倒に思えます。
「Unit Of Work」パターンを調べて、両方の問題を解決すると思われる解決策を思いつきましたが、この解決策に 100% の自信があるわけではありません。というクラスを作りましたDataBucket
。
// Slimmed down for readability
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext,
IReportsRepository reportsRepository,
IEmployeeRepository employeeRepository,
IDashboardRepository dashboardRepository)
{
_dataContext = dataContext;
this.ReportRepository = reportsRepository;
this.EmployeeRepository = employeeRepository;
this.DashboardRepository = dashboardRepository;
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
これにより、両方の問題が解決されるようです。データ バケット自体にはメソッドが1 つしかないSaveChanges
ため、データ バケットという 1 つのオブジェクトだけを挿入します。次に、すべてのリポジトリにプロパティとしてアクセスします。データ バケットは、コンストラクターでリポジトリのすべて (簡単に 50 以上) を受け入れるため、少し乱雑に見えます。
新しいリポジトリを追加するプロセスには、インターフェイスの作成、リポジトリの作成、Ninject でのインターフェイスとリポジトリのマッピング、データ バケットへのプロパティの追加とデータの入力が含まれます。
私は、上からのステップを排除するこれに代わるものを考えました。
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext)
{
_dataContext = dataContext;
this.ReportRepository = new ReportsRepository(dataContext);
this.EmployeeRepository = new EmployeeRepository(dataContext);
this.DashboardRepository = new DashboardRepository(dataContext);
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
これにより、Ninject のすべてのリポジトリ マッピングがほとんどなくなります。これは、それらがすべてデータ バケットでインスタンス化されるためです。したがって、新しいリポジトリを追加する手順は次のとおりです。インターフェイスの作成、リポジトリの作成、データ バケットへのプロパティの追加、およびインスタンス化。
このモデルに欠陥は見られますか? 表面的には、この方法でリポジトリを使用する方がはるかに便利に見えます。これは以前に対処された問題ですか?もしそうなら、この問題に対する最も一般的かつ/または最も効率的なアプローチは何ですか?