6

ドメインサービスからのIQueryableの結果をフィルタリングする必要がありますか?

たとえば...私の3つのポータル(Webサイト)は、ユーザーのタイプに応じて同じドメインサービスレイヤーにアクセスします。特定のリポジトリメソッドを呼び出して、結果を返します。

現在のリポジトリレイヤー:

    IQueryable<Products> GetAllProductsForCrazyUserNow(CrazyUser id);
    Products GetAProductForCrazyUserNow(CrazyUser id,product id);

    IQueryable<Products> GetProductsForNiceUserNow(NiceUser id);
    Products GetProductsForNiceUserNow(NiceUser id,product id);

リポジトリレイヤーでこれを行うのが最善でしょうか?

    IQueryable<Products> GetAllProducts();
    Products GetAProduct(product id);

次に、ドメインサービス内で、単純にフィルターを実行します。

var Niceman = IQueryable<Products> GetAllProducts().Where(u=> u.Name == "Nice");

注:読み取り専用のセッションと、リポジトリレイヤー内にCRUDを含むセッションがあるので、回答するときはそのことに注意してください。

2番目の質問:ドメインサービスレイヤーでフィルタリングを行う必要がありますか?このレイヤーは、エンティティを修正できる唯一のレイヤーです。つまり、Product.Price == 25.00; これはリポジトリ層に委任されません。

4

3 に答える 3

3

私は通常、リポジトリレイヤーを使用して単純なCRUD作業を行い、ドメインレイヤーにビジネスロジックを実行させます。場合によっては、そのデータをUIレイヤーに戻す前に必要なフィルタリングを実行します。

ビジネス/フィルタリングロジックをリポジトリレイヤーから分離すると、物事をクリーンに保つのに役立ちます。また、将来、別のタイプのデータアクセスパターンに移行した場合、ドメインレイヤーで分離されるため、そのコードの動作を変更する必要はありません。

于 2011-01-18T18:43:27.600 に答える
2

ハルーン、

IQueryable<Classes>リポジトリの外部で拡張メソッドを使用します。実際、私は「フィルター」と呼ぶ一連のクラスを持っており、それらは通常、これらの線に沿ったものです。

public static class ProductFilters
{
    public static IQueryable<Products> NiceMan(
        this IQueryable<Products> customQuery, string filterName)
    {
        if (!string.IsNullOrEmpty(filterName))
           customQuery = customQuery.Where(u => u.Name == filterName);
        return customQuery;
    }
   // create lots of other Products based filters here
   // and repeat with seperate IQueryable<Classes> per type
}

利用方法:

var Niceman = IQueryable<Products> GetAllProducts().NiceMan("Nice");

これはロジックの適切な分離であり、リポジトリをクリーンに保ちます。そして、2番目の質問への回答として、はい、リポジトリではなく、サービスレイヤー内でこのフィルター/拡張ロジックを使用してください。

于 2011-01-18T20:29:24.917 に答える
0

私自身も同じ質問をしました。それをサービスレイヤーに配置することに躊躇したのは、場合によっては、フィルタリングプロセスによってリポジトリから返されたレコードの大部分が削除される可能性があり、データベースから必要以上のデータを取得したくないということでした。

最終的にNHibernateに移行し、リポジトリメソッドにDetachedCriteria引数を受け入れさせました。次に、ユーザー情報をサービスレイヤーに渡し、IQueryableを操作するのではなく、DetachedCriteriaオブジェクトを作成してリポジトリに渡すことでフィルタリングを実行させ、SQLを変更してデータベースの作業を制限しました。

これまでのところ、これはかなりうまく機能しているようで、レポが基本的なCRUDのみを実行しているサービス層にロジックがかなりしっかりしているので、「感じ」が正しいです。

于 2011-05-04T15:17:31.613 に答える