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