1

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インターフェイスがあります。 (例えば、この場合、GroupContactを付加する方法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(); 

IContactsRepositoryGet<Group>()で継承されたGet<Contact>()と、IGroupsRepositoryから継承された間のあいまいさに関するビルドエラーメッセージが表示されます。 IRepositoryinherits the same generic interface with different types(リンクされた記事の例5を参照)が許可されていないことを私は理解しています。今

  • 私は他のインターフェースを介して継承しているので、私は以下のような、たとえば、これらのメソッドの「名前をオーバーライドする」可能性のチャンスはありますか?

    IContactsRepository : ITypedRepository<Contact> 
    { 
        IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); 
        ... 
    } 
    

そのように、私は、任意の曖昧さなしIRepository.Getcontactsからアクセスすることができます。それは可能ですか、またはこの問題の回避策はありますか?

、清澄化のための新しい質問、:

  • は、私が欲しいGet()方法のコントローラからの呼び出しで指定するには、とにかくはありますか?

  • 最初の問題に取り組む最も良い方法は何ですか - 1つのエンティティタイプではなく、多くのことを処理するリポジトリが必要ですか?

EDIT:ControllerからRepositoryクラスとコールの追加のコード例。

+0

明示的なインターフェイスの実装を検討してください。詳細については、http://stackoverflow.com/questions/1077816/access-modifiers-on-properties-in-c –

+0

ご返信ありがとうございます - 私はそれを試みて、明確化のためにいくつかのコードを追加しました。 –

+1

私はそれを理解していないたびにこの質問を1ポイントアップする –

答えて

0

私はあなたを考えますこの複雑さのすべてを必要としません。連絡先をグループに追加すると、グループが変更されます。私はグループクラスの連絡先のコレクションを持っていると仮定します。連絡先をグループに追加したら、単にグループを保存する必要があります。あなたは本当にAddContactToGroupメソッドが必要ですか?グループリポジトリインターフェースのSaveメソッドは同じ仕事をします。また、Groupの新しいすべてのリレーショナルプロパティに対して新しいメソッドは必要ありません。

Saveメソッド自体を実装するには、NHibernateを使用する場合、関連するメソッドを呼び出すだけです。

0

おそらく、CRUDの方法に加えて、あなたのIGroupRepositoryのメソッドを専門にしているでしょう:

IGroupRepository : ITypedRepository<Group> 
{ 
    bool AddContactToGroup(Group g, Contact C); 
} 
+0

ありがとう!私はすでにそれを持っていますが、これを試してみると、私のために働いていない継承チェーンです。 –

0

は、明示的な実装を呼び出す非あいまいな名前のメソッドを追加します。

​​
+0

それは本当にとても良いです!しかし、実際に私の問題を解決するわけではありません。私がこのようにすれば、インタフェースIRepositoryには、このメソッドが存在することを確認する何もありません。最初の場所...)。つまり、コントローラをインターフェイス経由でリポジトリから切り離すことができないので、簡単にテストすることはできません。 –

+1

なぜそれが存在することを確認する必要がありますか?明示的に呼び出す場合にのみ存在する必要があります。とにかく、Getメソッドは常にIRepository の明示的な実装として存在します。コントローラでは、IRepositoryではなく、IContactsRepositoryまたはIGroupRepositoryとしてリポジトリを宣言しますので、あいまいさはありません。 –

関連する問題