Hallo,
in einem meiner letzten Projekte habe ich mir eine einfache Datnzugriffs und Domänenschicht mit Linq2Sql erstellt. Dazu ein Repository zum Zugriff auf die Domänenobjekte. Eine Anforderung war, Objekte nach ganz unterschiedlichen Filterkriterien aus der Datenbank zu holen.
Welche Möglichkeiten gibt es dafür? Natürlich könnte ich für jede Suchabfrage eine Methode schreiben, das würde allerdings zu einem enormen Anstieg der Methodenzahl führen, und die Übersicht verabschiedet sich.
Ja in C#3.0 könnte man dem mit optionalen Parametern entgegen wirken, aber der Aufruf der Datenschicht wäre trotzdem unschön.
Ich könnte DynamicLinq verwenden, aber strings gefallen mir auch nicht so gut.
Nein ich habe mich für das Specification-Pattern entschieden (oder zumindest eine Art davon ;), und will euch hier kurz zeigen, wie das aussieht:
Natürlich erzeugt man sich erstmal wie gewohnt ein LinqModell (PitContentIndexes bei mir).
Danach ein Interface für eine Specification:
Durch den Einsatz von Expression ist der Linq-DataContext in der Lage, den in Code geschriebenen Filter nach SQL zu übersetzen.
Eine Specification um nach einer Produkt- ID zu Filtern, sieht so aus: (ProductID muss im LinqModel vorhanden sein)
Um das Pattern sinnvoll anwenden zu können, benötigen wir noch ein Repository, an welches wir die Specifications schicken können: (das ist nur der wichtige Ausschnitt aus meinem Repository)
Hier sieht man gut, wie man den Filter der Specification einfach an die Where-Methode des LinqModels übergeben kann. Der Filter wird erst auf der Datenbank ausgeführt.
Nun brauchen wir noch einen Service um die Specification nach den Suchanfragen/UseCases zu erstellen und an das Repository zu reichen:
Wie man sieht, ist es eine relativ einfache Sache ist, ein einfaches Specification-Pattern mit Linq2Sql umzusetzen.
Sebastian :)




Keine Kommentare:
Kommentar veröffentlichen