私のドメインモデルでは、すべてのクラスが派生する基本エンティティクラスがあります。
現在のユーザーの権限に基づいてフィルタを動的に作成したいと考えています。
たとえば、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