6

我应该从域服务中过滤我的 IQueryable 结果吗?

例如...我的 3 个门户(网站)访问同一个域服务层,根据用户类型,我调用特定的存储库方法并返回结果,

当前存储库层:

    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 的会话,因此请在回答时记住这一点。

第二个问题:我应该在域服务层做任何过滤吗?这一层是唯一可以修改实体的层,即 Product.Price == 25.00; 这没有委托给存储库层。

4

3 回答 3

3

我通常使用存储库层来执行简单的 CRUD 工作,并让域层执行任何业务逻辑,或者在您的情况下,在将数据传递回 UI 层之前需要进行任何过滤。

将业务/过滤逻辑与存储库层分离将有助于保持干净。此外,将来如果您转向不同类型的数据访问模式,那么您将不必更改该代码的工作方式,因为它将在您的域层中分离。

于 2011-01-18T18:43:27.600 回答
2

哈龙,

IQueryable<Classes>我在 repo的外部使用扩展方法。事实上,我有一组我称之为“过滤器”的类,它们通常是这样的:

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");

我发现这是一个很好的逻辑分离并保持 repo 干净。在回答第二个问题时,是的,在服务层中使用这个过滤器/扩展逻辑,而不是 repo。

于 2011-01-18T20:29:24.917 回答
0

我自己也有同样的问题。我对将其放入服务层的犹豫是,在某些情况下,过滤过程可能会删除从 repo 返回的大部分记录,并且我不想从数据库中提取不必要的数据。

我最终搬到了 NHibernate,并让我的存储库方法接受DetachedCriteria参数。然后,我将用户信息传递给服务层并让它执行过滤,而不是通过操作 IQueryable 而是通过构造一个DetachedCriteria对象并将其传递给存储库,从而修改 SQL 并限制数据库工作。

到目前为止,它似乎运行得很好,并且“感觉”正确,因为我的逻辑在服务层中非常稳固,而 repo 只做基本的 CRUD。

于 2011-05-04T15:17:31.613 回答