LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
Spezifikation:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- Die Geschäftslogik ist in der Beschreibung abgekapselt (mit einem Namen, offenbaren, was es ist).
- DRY: Sie wiederholen nicht, dass Linq über den Code, verwenden Sie einfach die Spezifikation
Ich mag Spezifikation verwenden, wenn ich denke, dass die Regel wichtig genug ist, um den Code zu seinen explizit BUT es gehört nicht zu der Einheit.
Beispiel:
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;
}
}
Ist es aus dem Customer
die responsability zu entscheiden, ob er in der Lage ist, einen Kredit zu erhalten?
Wahrscheinlich nicht.
Also mit der Spezifikation können Sie diese Logik aus dem Customer
entfernen (es gehörte nie dazu). Sie können so etwas wie IsAbleToReceiveCreditSpecification
erstellen und alle Logik dort platzieren. Wir können weiter gehen und Spezifikationen kombinieren, zum Beispiel: Sie könnten eine SecureAgeSpecification
und eine AssetsGreaterThanSpecification
erstellen und sie verwenden, um die IsAbleToReceiveCreditSpecification
zu komponieren.
Also ich glaube nicht, dass LINQ die Spezifikation ersetzt. Tatsächlich verbessert es das Muster. Es gibt einige Implementierungen von Specification, die LINQ intern mit IQueriable<T>
verwenden. Damit können Sie die Spezifikation in Ihren ORM-Abfragen auf der Repository/DataAccess-Ebene verwenden.
Ich bin gerade mit dieser exakten Situation konfrontiert, daher ist diese Frage für mich von großem Interesse. –