LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
Spécification:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- La logique métier est encapsulé dans la spécification (avec un nom qui révèle ce qu'il est).
- DRY: vous ne répétez pas que LINQ sur le code, il vous suffit d'utiliser la spécification
J'aime utiliser la spécification quand je pense que la règle est suffisamment important pour être explicite dans le code, mais il n'appartient pas à l'entité.
Exemple:
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;
}
}
est-il de la Customer
la responsabilité de décider si lui est en mesure de recevoir un certain crédit?
Probablement pas. Donc, avec les spécifications, vous pouvez supprimer cette logique du Customer
(il n'y a jamais appartenu). Vous pouvez créer quelque chose comme IsAbleToReceiveCreditSpecification
et y mettre toute la logique. Nous pouvons aller plus loin et combiner les spécifications, par exemple: vous pouvez créer un SecureAgeSpecification
et un AssetsGreaterThanSpecification
et les utiliser pour composer le IsAbleToReceiveCreditSpecification
. Donc je ne pense pas que LINQ remplace la spécification. En fait, cela améliore le modèle. Il existe certaines implémentations de spécification qui utilisent LINQ en interne avec IQueriable<T>
, avec ceci vous pouvez utiliser la spécification dans vos requêtes ORM au niveau Repository/DataAcess.
Je suis à peu près dans la situation actuelle, donc cette question m'intéresse beaucoup. –