LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
Спецификация:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- Бизнес-логика заключена в спецификацию (с именем, которое показывает, что это такое).
- СУХОЙ: вы не повторяете этот linq по коду, вы просто используете спецификацию
Мне нравится использовать спецификацию, когда я считаю, что правило достаточно важно, чтобы быть явным в коде, и оно не принадлежит естественно сущности.
Пример:
public class Customer
{
//...
public bool IsAbleToReceiveCredit(decimal creditValue)
{
var secureAge = this.Age > 18 && this.Age < 60;
var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;
return secureAge && personalAssetsGreaterThanCreditValue;
}
}
От Customer
ответственности зависит, сможет ли он получить какое-то вознаграждение? Банк спросит у клиента, может ли он получить кредит?
Возможно нет.
Таким образом, с помощью спецификации вы можете удалить эту логику из Customer
(она никогда не принадлежала ему). Вы можете создать что-то вроде IsAbleToReceiveCreditSpecification
и поместить туда всю логику. Мы можем пойти дальше и объединить спецификации, например: вы можете создать SecureAgeSpecification
и AssetsGreaterThanSpecification
и использовать их для составления IsAbleToReceiveCreditSpecification
.
Поэтому я не думаю, что LINQ заменяет спецификацию. На самом деле это улучшает рисунок. Существуют некоторые реализации спецификации, которые используют LINQ внутри с IQueriable<T>
, при этом вы можете использовать спецификацию внутри своих запросов ORM на уровне репозитория/доступа к данным.
person
fabriciorissetto
schedule
06.01.2016