1

Repository PatternASP.NET MVC アプリケーション (.NET 3.5、ASP.NET MVC 1.0、および Entity Framework を使用) を開発しているときに、を理解しようとしています。依存性注入を取得し、すべてが 1 つのコントローラーと 1 つのエンティティー型で機能するのに十分な距離まで到達しましたが、今では、異なる型間の関係のサポートを実装するところまで到達しており、行き詰まっています。

私が見たすべての例では、リポジトリ インターフェイスは のような名前で、アイテムのみIContactsRepositoryに関係する (CRUD) メソッドが含まれています。Contactのグループ化を実装したいContactsので、 というエンティティ タイプとGroupIGroupRepositoryグループに対する操作 (CRUD) を処理するためのインターフェイスがあります。

  • 複数のエンティティ タイプに関係するメソッドはどこに属しますか (この場合、たとえば、 aに aAddToGroupを追加するメソッド)。ContactGroup

リポジトリのより大きな継承構造を試み、次のインターフェイスを作成しました。

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 を参照)。IContactsRepositoryGet<Group>()IGroupsRepositoryIRepository

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

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

そうすれIRepository.Getcontactsば、あいまいさなくアクセスできます。それは可能ですか、またはこの問題の回避策はありますか?

明確にするために、新しい質問:

  • コントローラーからの呼び出しで、どのGet()メソッドが必要かを指定する方法はありますか?

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

編集:Repositoryからのクラスと呼び出しのコード例を追加しましたController

4

3 に答える 3

0

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

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

于 2010-01-01T13:42:22.627 に答える
0

CRUD メソッドに加えて、おそらく IGroupRepository に特殊なメソッドがあるでしょう。

IGroupRepository : ITypedRepository<Group>
{
    bool AddContactToGroup(Group g, Contact C);
}
于 2009-07-10T20:39:34.383 に答える