MVC - 域服务负责过滤还是存储库层?

时间:2011-01-18 17:34:17

标签: c# asp.net-mvc model-view-controller repository domainservices

我应该从域名服务过滤我的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;这不会委托给存储库层。

3 个答案:

答案 0 :(得分:2)

哈龙,

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我自己也有同样的问题。我把它放在服务层的犹豫是,在某些情况下,过滤过程可以删除从repo返回的大量记录,我不想从数据库中提取超过必要的数据。

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

到目前为止它似乎工作得很好,并且“感觉”正确,因为我在服务层中非常稳定地使用repo只进行基本的CRUD。