내 도메인 모델에는 모든 클래스가 파생 된 기본 엔터티 클래스가 있습니다.
현재 사용자의 권한을 기반으로 필터를 동적으로 만들 수 있기를 바랍니다.
예 : 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 블록이다.
누구나 더 좋은 아이디어가 있습니까?
감사
조니
저는 여기에서 뭔가를 놓치고 있습니다 만, Entity 클래스에 "CreateLinqFilter"를 선언 한 다음이 모든 relfection 유형 대신에 선언문을 사용하면 "entity.CreateLinqFilter 내가 말했듯이, 나는 아마도 무언가를 잃어 버렸고, 무엇을 알고 싶습니다. ;-) – Chris
@Chris CreateLinqFilter 함수는 엔티티의 Collections *에서 작동하기 때문에 꽤 귀엽습니다. 무의미한 단일 개체의 맥락에서, 함수는 실제로 정적입니다 ... –
아, 그래, 그 말이 맞아. 난 아직도 제네릭 주위에 머리를 얻는 데 그들이 어디 살 필요가 있습니다. :) – Chris