ASP.NET MVCアプリケーション(.NET 3.5、ASP.NET MVC 1.0、およびEntity Frameworkを使用)を開発しながら、Repository Pattern
を理解しようとしています。依存関係の注入や1つのコントローラと1つのエンティティタイプを扱うのに十分な距離を確保しましたが、今はさまざまなタイプ間の関係のサポートを実装しています。C#のインターフェイスで継承されたメソッドの名前を変更しました
私が見たすべての例では、リポジトリインターフェイスはIContactsRepository
と呼ばれ、Contact
アイテムにのみ関連する(CRUD)メソッドが含まれています。 Contacts
のグループ化を実装したいので、Group
と呼ばれるエンティティタイプと、グループに対するCRUD操作のためのIGroupRepository
インターフェイスがあります。 (例えば、この場合、Group
にContact
を付加する方法AddToGroup
が、)それが複数のエンティティタイプと関係する方法属さない
- ?次のように、
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();
IContactsRepository
とGet<Group>()
で継承されたGet<Contact>()
と、IGroupsRepository
から継承された間のあいまいさに関するビルドエラーメッセージが表示されます。 IRepository
inherits the same generic interface with different types(リンクされた記事の例5を参照)が許可されていないことを私は理解しています。今
私は他のインターフェースを介して継承しているので、私は以下のような、たとえば、これらのメソッドの「名前をオーバーライドする」可能性のチャンスはありますか?
IContactsRepository : ITypedRepository<Contact> { IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); ... }
そのように、私は、任意の曖昧さなしIRepository.Getcontacts
からアクセスすることができます。それは可能ですか、またはこの問題の回避策はありますか?
、清澄化のための新しい質問、:
は、私が欲しい
Get()
方法のコントローラからの呼び出しで指定するには、とにかくはありますか?最初の問題に取り組む最も良い方法は何ですか - 1つのエンティティタイプではなく、多くのことを処理するリポジトリが必要ですか?
EDIT:Controller
からRepository
クラスとコールの追加のコード例。
明示的なインターフェイスの実装を検討してください。詳細については、http://stackoverflow.com/questions/1077816/access-modifiers-on-properties-in-c –
ご返信ありがとうございます - 私はそれを試みて、明確化のためにいくつかのコードを追加しました。 –
私はそれを理解していないたびにこの質問を1ポイントアップする –