Repository Pattern
ASP.NET MVC アプリケーション (.NET 3.5、ASP.NET MVC 1.0、および Entity Framework を使用) を開発しているときに、を理解しようとしています。依存性注入を取得し、すべてが 1 つのコントローラーと 1 つのエンティティー型で機能するのに十分な距離まで到達しましたが、今では、異なる型間の関係のサポートを実装するところまで到達しており、行き詰まっています。
私が見たすべての例では、リポジトリ インターフェイスは のような名前で、アイテムのみIContactsRepository
に関係する (CRUD) メソッドが含まれています。Contact
のグループ化を実装したいContacts
ので、 というエンティティ タイプとGroup
、IGroupRepository
グループに対する操作 (CRUD) を処理するためのインターフェイスがあります。
- 複数のエンティティ タイプに関係するメソッドはどこに属しますか (この場合、たとえば、 aに a
AddToGroup
を追加するメソッド)。Contact
Group
リポジトリのより大きな継承構造を試み、次のインターフェイスを作成しました。
ITypedRepository<T>
{
IEnumerable<T> GetAll();
T Get(int id);
bool Add(T newObj);
bool Edit(T editedObj);
bool Delete(int id);
}
IContactsRepository : ITypedRepository<Contact> { }
IGroupsRepository : ITypedRepository<Group> {
bool AddToGroup(int contactId, int groupId);
}
IRepository : IContactsRepository, IGroupsRepository
IRepository
次に、次のように、を継承するマスター リポジトリを作成しようとしました。
public class EntitiesRepository : IRepository
{
IEnumerable<Contact> IRepository<Contact>.Get()
{
throw new NotImplementedException();
}
IEnumerable<Group> IRepository<Group>.Get()
{
throw new NotImplementedException();
}
// Etc. All methods were generated by hitting [Ctrl]+[.] with the cursor on
// the interface inheritance reference to IRepository and selecting
// "Explicitly implement IRepository"
}
このコードを使用して、コントローラからリポジトリ内のメソッドの 1 つを呼び出そうとするとすぐに
var contacts = _repository.Get();
経由でGet<Contact>()
継承されたものと経由で取得されたもののあいまいさに関するビルド エラー メッセージが表示されます。は異なるタイプの同じジェネリック インターフェイスを継承するため、これは許可されないことを理解しました (リンクされた記事の例 5 を参照)。IContactsRepository
Get<Group>()
IGroupsRepository
IRepository
今、私は他のインターフェースを介して継承しているので、たとえば以下のように、これらのメソッドの「名前をオーバーライド」できる可能性はありますか?
IContactsRepository : ITypedRepository<Contact> { IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); ... }
そうすれIRepository.Getcontacts
ば、あいまいさなくアクセスできます。それは可能ですか、またはこの問題の回避策はありますか?
明確にするために、新しい質問:
コントローラーからの呼び出しで、どの
Get()
メソッドが必要かを指定する方法はありますか?1 つのエンティティ タイプだけでなく、多くのことを処理するリポジトリが必要であるという、最初の問題に取り組む最善の方法は何ですか?
編集:Repository
からのクラスと呼び出しのコード例を追加しましたController
。