Я искал шаблон спецификации для своих репозиториев, я использую EF4 внутри своих репозиториев, чтобы запрашивать базу данных и отображать выбранные объекты, передавая выражение, что-то вроде этого: -
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return _objectSet.Where<TEntity>(predicate);
}
Это работает нормально, если вы просто работаете с одним набором объектов, но скажите, хотите ли вы выбрать все комментарии, сделанные пользователем, которые превышают 128 символов, и пользователь активен. Как бы вы создали спецификацию при использовании двух или более наборов объектов?
Пример: -
class User
{
public string Name { get; set; }
public bool Active { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public User()
{
Posts = new List<Post>();
}
}
class Post
{
public string Text { get; set; }
public DateTime Created { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public Post()
{
Comments = new List<Comment>();
}
}
class Comment
{
public string Text { get; set; }
public DateTime Created { get; set; }
}
Для этого в Linq есть: -
* * 1010
Как бы вы преобразовали это в спецификационный класс? Может быть, я просто не вижу что-то, что кажется разумным:)
EDIT
Спецификация интерфейса:
public interface ISpecification<TEntity>
{
bool IsSatisfiedBy(TEntity entity);
}