Entity Frameworkで仕様パターンを使用して、データベースから取得されるデータをフィルタリングします。同じアプローチを使用して、ニーズに適合させることができると思います。
DIコンテナを使用して、仕様やその他の必要なオブジェクトを注入できます。最初のステップは、次のような仕様オブジェクトのコントラクトを定義することです。
public interface ISpecification<T> where T : class
{
Expression<Func<T, bool>> GetExpression();
bool IsSatisfiedBy(T entity);
}
一般的な仕様オブジェクトは、次のように定義できます。
public class Specification<T> : ISpecification<T> where T : class
{
private Expression<Func<T, bool>> expression;
public Expression<Func<T, bool>> GetExpression()
{
return expression;
}
public Specification(Expression<Func<T, bool>> expression)
{
this.expression = expression;
}
public bool IsSatisfiedBy(T entity)
{
var query = (new[] { entity }).AsQueryable();
return query.Any(this.expression);
}
}
次に、Fooクラスを次のように変更できるため、DI/IoCコンテナーを使用して依存関係を注入できます。
public class Foo()
{
public ISpecification<Foo> Specification
{
get;
private set;
}
public Foo(ISpecification<Foo> specification)
{
this.Specification = specification;
}
public void DoSomething()
{
if(Specification.SatisfiedBy(this))
{
//...
}
}
}
仕様の作成と使用:
// example - create one specification
Expression<Func<Foo, bool>> expression = ....;
ISpecification<Foo> fooSpecification = new Specification<Foo>(expression);
// using the specification with linq
var entities = dbContext.Foos.Where(fooSpecification.GetExpression());
// performing validation
var foo = new Foo{
// ....
};
if(fooSpecification.IsSatisfiedBy(foo))
{
// do something....
}
詳細はこちら:
http://ruijarimba.wordpress.com/2011/06/05/entity-framework-and-t4-generate-specification-objects-for-your-entities/