我有一个包含以下内容的域模型:
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
为给定客户返回的项目,这样用户就不会看到任何不属于他们并标记为私有的评论。
我试着做这样的事情:
criteria.CreateCriteria("Comments")
.Add(Restrictions.Or(Restrictions.Eq("Private", false),
Restrictions.And(Restrictions.Eq("Private", true),
Restrictions.Eq("CreatedBy.Id", requestingUser.Id))));
但这并没有流向延迟加载的评论。
我不希望使用过滤器,因为这将需要与会话交互(当前未暴露给服务层)或强制我的存储库了解用户上下文(这似乎应该是太多的逻辑一个愚蠢的层)。由于其他原因,过滤器也是一个肮脏的解决方案——确定什么是可见的,什么不是的逻辑比私有标志更详细。
我不想在服务层中使用 LINQ 来过滤集合,因为这样做会以非常糟糕的方式破坏整个延迟加载的好处。评论不相关的客户列表将导致数据库调用风暴,这将非常缓慢。我宁愿不在我的表示层(一个 MVC 应用程序)中使用 LINQ,因为它似乎是错误的地方。
任何想法是否可以使用DetachedCriteria
?还有其他方法可以做到这一点吗?