2

主に Josh Smith のmsdn articleに基づいたマスター/詳細クラスがいくつかあります。特に例としては素晴らしいコードですが、リポジトリのサブセットが必要な状況をどのように処理するのが最善か疑問に思っています。

Josh には AllCustomersViewModel というクラスがあり、次のようなコードを作成しています。

    public AllCustomersViewModel(CustomerRepository customerRepository)
    {
        if (customerRepository == null) throw new ArgumentNullException("customerRepository");

        // Populate the AllCustomers collection with CustomerViewModels.
         _allCustomers = _customerRepository
            .GetCustomers()
            .Select(cust => new CustomerViewModel(cust, _customerRepository))
            .ToList();
   }

PreferredCustomers、ExCustomers、LocalCustomers などが必要な状況をどのように解決しますか??

彼のコードは、それぞれに ViewModel クラスを提案し、そのクラスにリポジトリのフィルタリングがハードコードされています。

または、オプションのフィルターをリポジトリと共に ViewModel に渡す方法はありますか?

あなたのコードはこの特定の問題をどのように解決しますか?

余談ですが、このような問題を解決するために SpeciaficationPattern または IQueryable を使用する方法を示すリンクや良い例はありますか?

乾杯、
ベリル

4

1 に答える 1

1

1つのオプション(そしておそらく最もクリーンな)は、単にそれらのメソッドを-に追加することですCustomerRepository-たとえばGetPreferredCustomers()GetLocalCustomers()など。

また、実際には抽象化に反対する必要があるICustomerRepositoryため、ビューモデルコンストラクターにを渡す必要があります。これにより、ビューモデルコードが具体的な顧客リポジトリ(この場合はXMLファイルから読み取るリポジトリ)から切り離され、単体テストなどの実装を簡単に交換できるようになります。

あなたが言及するように、他のオプションはあなたのリポジトリが公開することIQueryable<T>です。IQueryableに縛られて満足していて、データアクセスの実装がLINQプロバイダーをサポートすると確信している場合は、それが優れた柔軟性を提供します。詳細については、こちらをご覧ください。

個人的には、特に大規模なアプリケーションでは、最初のオプションを好みます。

于 2011-05-23T09:01:29.720 に答える