【发布时间】:2011-10-16 21:21:00
【问题描述】:
我有一个包含以下内容的域模型:
public class Customer : EntityBase<Customer>, IAggregateRoot
{
public IList<Comment> Comments { get; set; }
}
public class Comment : EntityBase<Comment>
{
public User CreatedBy { get; set; }
public bool Private { get; set; }
}
我有一个服务层,通过它我可以检索这些实体,传递给该服务层的参数是请求用户是谁。
我想做的是能够在服务层中构造一个DetachedCriteria,这将限制为给定客户返回的Comment 项目,因此不会向用户显示任何不属于的 cmets并标记为私有。
我试着做这样的事情:
criteria.CreateCriteria("Comments")
.Add(Restrictions.Or(Restrictions.Eq("Private", false),
Restrictions.And(Restrictions.Eq("Private", true),
Restrictions.Eq("CreatedBy.Id", requestingUser.Id))));
但这不会流向延迟加载的 cmets。
我不希望使用过滤器,因为这将需要与会话交互(当前未暴露给服务层)或强制我的存储库了解用户上下文(这在什么应该是哑层)。由于其他原因,过滤器也是一个肮脏的解决方案——确定什么可见什么不可见的逻辑比私有标志更详细。
我不想在服务层使用 LINQ 来过滤集合,因为这样做会以非常糟糕的方式破坏整个延迟加载的好处。 cmets 不相关的客户列表将导致数据库调用风暴,这将非常缓慢。我宁愿不在我的表示层(一个 MVC 应用程序)中使用 LINQ,因为它似乎不适合它。
任何想法是否可以使用DetachedCriteria?还有其他方法可以做到这一点吗?
【问题讨论】:
标签: nhibernate detachedcriteria