LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
Спецификация:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- Бизнес-логика инкапсулирована в спецификации (с именем, раскрывающим, что это такое).
- DRY : вы не повторяете этот 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 на уровне Repository / DataAcess.