これまで使用したことのないパターンである仕様パターンを使用するプロジェクトを取り上げたので、そのパターンを調査する必要がありました。OrderByおよびSkip/Take機能がないことに気付きました。パターンでこれを実装する方法を示す場所が見つかりません。
これを仕様パターンにどのように追加するのが最善かを考えるのに苦労しています。しかし、仕様が " " を扱っているのExpression<Func<T, bool>>
に対し、これを orderby などと一緒に保存できるとは思わないなど、ヒットの問題があります。
基本的に、次のようなクラスがあります。
public class Specification<T> : ISpecification<T>
{
public Expression<Func<T, bool>> Predicate { get; protected set; }
public Specification(Expression<Func<T, bool>> predicate)
{
Predicate = predicate;
}
public Specification<T> And(Specification<T> specification)
{
return new Specification<T>(this.Predicate.And(specification.Predicate));
}
public Specification<T> And(Expression<Func<T, bool>> predicate)
{
return new Specification<T>(this.Predicate.And(predicate));
}
public Specification<T> Or(Specification<T> specification)
{
return new Specification<T>(this.Predicate.Or(specification.Predicate));
}
public Specification<T> Or(Expression<Func<T, bool>> predicate)
{
return new Specification<T>(this.Predicate.Or(predicate));
}
public T SatisfyingItemFrom(IQueryable<T> query)
{
return query.Where(Predicate).SingleOrDefault();
}
public IQueryable<T> SatisfyingItemsFrom(IQueryable<T> query)
{
return query.Where(Predicate);
}
}
これにより、仕様を作成し、where 句を渡すことができます。また、「And」、「Or」を使用してルールを連鎖させることもできます。例えば:
var spec = new Specification<Wave>(w => w.Id == "1").And(w => w.WaveStartSentOn > DateTime.Now);
「OrderBy」と「Take」のメソッドを追加するにはどうすればよいですか?
これは既存のコードなので、既存のコードに影響を与えるような変更を行うことはできず、リファクタリングするのはかなりの作業になります。したがって、どのソリューションも、そこにあるものとうまく連携する必要があります。