В моей доменной модели у меня есть базовый класс сущности, из которого все классы происходят.
Я бы хотел иметь возможность динамически создавать фильтры на основе разрешений текущего пользователя.
Например, для класса EmployeeЯ бы определил, что работник может видеть себя и свой отдел.
Мой метод будет выглядеть примерно так:
public static IQueryable<Employee> CreateLinqFilter(IQueryable<Employee> query, User user)
{
return query.Where(e => e.Id == user.Id || e.Department.Manager.Id == user.Id);
}
, а затем, в моем базовом классе хранилища, я будуМне нравится определять тип динамически и вызывать правильный метод CreateLinqFilter:
protected IQueryable CreateLinq<T>(User user)
{
var query = Session.Linq<T>();
Type t = typeof(T);
//if not an entity- do not perform filter
if (!t.IsAssignableFrom(typeof(Entity)))
{
return query;
}
//now we know that T is a sub-class of Entity.
return CreateLinqFilter<T>(query,user);
}
protected IQueryable CreateLinqFilter<T>(IQueryable<T> query, User user)
//the following line won't compile:
//where T: Entity
{
//i'd like to be able to do:
//T.CreateFilter(query);
//instead, I have to do this?
if (typeof(T) == Employee)
{
return Employee.CreateLinqFilter(query,user);
}
if (typeof(T) == Department)
{
return Department.CreateLinqFilter(query,user);
}
//etc...
}
Единственное решение, которое у меня есть, это множество блоков if-else, которые довольно неприглядны.
кто-нибудь есть идеи получше?
спасибо
Джонни