私はこれをかなり調べましたが、「完璧な」解決策は見つかりませんでした。リポジトリパターンは、存続期間の短いコントローラーに存在するためコンテキストが存続期間が短いMVCアプリケーションでうまく機能しますが、VMが長期間存続できるwpfアプリに同じ構造を適用しようとすると、問題が発生します。
私は過去にこのソリューションを使用しましたが、これは、極端なものまで抽象化しようとする多くのレポパターンよりもはるかに単純で、デバッグが困難な読み取り不可能な量のコードをもたらします。手順は次のとおりです...
- EDMXがデータアクセスレイヤーとして機能する別のプロジェクトを作成する
- 同じプロジェクトの下に「リポジトリ」フォルダを作成します
「作業ユニット」として機能する基本クラス「BaseRepository」を作成します。IDisposable
あなたがAでこれを使用できるようになりますusing(){}
し、partial
あなたが他のリポジトリを実装しないことができます
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
「MyOtherRepository」という名前の別のファイルを作成します。同じ部分クラスを作成しますが、そのファイルに含める内容に基づいてメソッドを実装します
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
VMでこれを行うことができます...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
これにより、すべてのリポジトリが1つのクラスにグループ化されるため、個別のコンテキストを処理する必要がありません。メソッドをさまざまなファイルにグループ化することで、さまざまなリポジトリをより適切に管理でき、コードの重複を防止できます。その上、コンテキストは、このパターンを使用しない場合と同じように短命です。
欠点は、大規模なシステムでは、リポジトリの下にバンドルされる多くのメソッドがある可能性があることです。その場合の1つの解決策は、「検索」や「追加」などのいくつかの基本的な一般的なコマンドを実装し、それぞれのリポジトリに専用のコマンドを実装することです。