3

Web サイト プロジェクトにASP.NET MVCを使用することに決め、書かれているいくつかのベスト プラクティスに従いたいと考えています。

そのため、ドメイン/モデルを別のプロジェクトに分離し、IRepositories と具体的なリポジトリを作成し、 IoCとしてCastle Windsorに注目しました。

私が今直面している問題は、特定のコントローラーの場合、コンストラクターで複数の IRepository パラメーターを渡す必要があることです。

私の質問は次のとおりです。

  1. おそらく作成したリポジトリが多すぎたのでしょうか。通常、1 つのリポジトリを 1 つのエンティティ クラスに 1 つのデータベース テーブルにマップします。私のリポジトリには、実質的に複数のエンティティ/データベース テーブルを含める必要がありますか?
  2. IoC と Dependency Injection の要点を見逃していましたか? params が Controller コンストラクターにどのように渡されるかを気にする必要はありませんか?

ある種の文脈を与えるために。Web サイトの一部には、物件の種類(城、家、パブなど)、場所(郵便番号、都市)、営業時間などで検索可能な物件の Google マップが表示されます。したがって、これらの検索可能なコンポーネントはすべて、PropertyType、Address という個別のエンティティです。都市、Address.Postcode.Lat+Long、OpeningTime.DateTime. したがって、SearchController コンストラクターに渡す必要がある 3 つの別個のリポジトリーもあります。

これは単純な例ですが、将来的にはさらに多くのリポジトリ パラメータが他のコントローラに渡されることを想定できます。

これがすべて理にかなっていることを願っています。

回答やアドバイスをありがとう。

4

1 に答える 1

3

IoC がコンストラクターに渡すすべてのロジックを処理するパラメーターの数は気にしません。

コントローラーのパラメーターが多すぎる場合は、コントローラーの機能を分割するか、ロジックをサービス クラスに移動することを検討します。

リポジトリに関しては、通常、実装に単一のエンティティを使用する汎用リポジトリを使用します。次に、その情報を論理ユニットに集約するサービス クラスがあります。このシナリオでは、コントローラーはサービスへのアクセスのみを必要とします。例えば:

interface IRepository<T>
{
    IQueryable<T> GetAll();
    T GetOne(int id);
    void Save(T item);
    void Delete(T item);
}

class OrderService
{
    public OrderService(IReopository<Order> orderRepository, IRepository<OrderDetail> orderDetailRepository, IRepository<Payment> paymentRepository, etc) { }

    public Order CreateOrder(List<OrderDetails> details)
    {}
    // .. other aggregate methods
}
于 2009-05-16T14:22:50.883 に答える