У меня есть модель домена, которая включает в себя что-то вроде этого:
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 всервисный слой для фильтрации коллекции, потому что это очень сильно испортит всю ленивую загрузку.Списки клиентов, чьи комментарии не относятся к делу, могут вызвать бурю обращений к базе данных, которая будет очень медленной.Я бы предпочел не использовать LINQ в моем уровне представления (приложение MVC), потому что это кажется неподходящим местом для него.
Есть идеи, возможно ли это с помощью DetachedCriteria
?Есть ли другие способы сделать это?