2013-07-24 20 views
16

Ich versuche, das "Abfrage Objekt Design Pattern" zu verstehen. Ich finde keine guten und einfachen Beispiele dafür. Könnte mir jemand helfen zu verstehen, wofür dieses Designmuster steht und in welchem ​​Problem wir das umsetzen können?Warum Abfrage Objekt Design Pattern

+0

http: // Stackoverflow.com/questions/2068478/query-object-pattern-design-pattern – Bart

Antwort

25

Das Abfrageentwurfsmuster wird normalerweise in Kombination mit dem Repository-Entwurfsmuster verwendet.

Lassen Sie uns mit einem Beispiel gehen und dann werde ich einen schönen Artikel zum Lesen geben. Lassen Sie uns sagen, dass wir eine Datenbank, wo wir Informationen speichern, um unsere Kunden und deren Aufträge usw.

Dann wir eine erste Repository wie folgt zu erstellen:

class CustomerRepository() { 
    Customer GetById(int id) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
    void GetCustomerWithOrder(int orderId); 
    void GetCustomersWithOrdersMoreThan(int numberOfOrders); 
} 

Wie wir Sie erstellt für jede Abfrage kann sehen, ein Methode im Repository, die für eine begrenzte Anzahl von Abfragen sehr gut und gut ist, aber wenn wir eine Menge von ihnen haben und sie beginnen, kompliziert mit vielen Kombinationen (zB erhalten mich Kunden mit Käufen, die 1000 überschreiten und leben in New York und ihr Kreditlimit ist weniger als 3000) dann werden wir am Ende mit einer langen Liste von Methoden und noch schlimmer, einige Geschäftslogik in Form von Quer durchlecken In den Repositories, die wir nicht passieren wollen.

So Refactoring, dass wir das Repository so etwas wie dies zu ändern:

class CustomerRepository() { 
    Customer[] Get(Query query) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
} 

Wie Sie sehen können wir ein Query-Objekt sind vorbei, die unsere Abfrage in Form eines Objekts und das Repository repräsentiert hat Ein und einziges Repository, um diese Abfrage auszuführen und uns die Ergebnisse zurückzugeben.

Jetzt, wie dieses Abfrageobjekt implementieren und wie man es baut, erfordert viel Code, also an diesem Punkt werde ich dich zu diesem nice article verweisen. Es ist in C#, aber Sie werden es sehr hilfreich finden, auch können Sie die Criteria API (Java) ansehen, die von NHibernate verwendet wird, um eine andere, aber ähnliche Implementierung zu sehen.

+0

ok, ich verstehe die genaue Verwendung des Abfrageobjekts Entwurfsmuster jetzt. Schönes Beispiel und schöne Erklärung. Vielen Dank. Und jetzt habe ich eine andere Frage dazu. Die Kriterien-API stellt das Entwurfsmuster für das Abfrageobjekt bereit und kann einfach verwendet werden. Aber etwas verwirrt darüber, dies programmatisch zu implementieren. In dem oben erwähnten Beispiel injizieren Sie das Query-Objekt. Aber wie sieht es aus, wenn ich das in meiner App implementieren möchte? –

+1

@santu Welche Sprache benutzen Sie und haben Sie den Artikel in C# überprüft, von dem ich Ihnen erzählt habe? –

+0

Ich benutze Java. Ich habe C# überprüft. Aber ich dachte, wie man dieses Muster nur für die DAO-Aufrufe verwendet, die die verschiedenen individuellen CRUD-Operationen ausführen. –

4

Das Abfrageobjekt stellte eine Abfrage dar, die in der Sprache der Domäne geschrieben wurde und eine Implementierung des Abfrageobjektmusters war. Das Query-Objektmuster, wie durch Fowler beschrieben ist „ein Objekt, das eine Datenbankabfrage darstellt.“ Ohne einen Mechanismus von Abfrage-, würde das Repository mit unzähligen Abrufmethoden überschwemmt sein, wie in diesem Code-Schnipsel zu sehen:

public interface ICustomerRepository  
{   
    IEnumerable<Customer> FindAll(); 
    IEnumerable<Customer> FindAllVIPCustomers(); 
    IEnumerable<Customer> FindByOrder(Guid ID); 
    IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders(); 
    …  
} 

Stattdessen ermöglicht das Abfrageobjekt, dass jede Abfrage erstellt und dann an das Repository gesendet werden kann, damit sie erfüllt wird. Der Hauptvorteil des Query-Object-Musters besteht darin, dass es die zugrundeliegende Datenbankabfragesprache vollständig abstrahiert und somit die Infrastrukturbelange der Datenpersistenz und -wiedergewinnung aus der Business-Schicht heraushält. Zu einem bestimmten Zeitpunkt muss jedoch die rohe Abfragesprache der Datenbank erstellt werden; Dies wird durch einen datenbankspezifischen QueryTranslator erreicht, der die Query Objects übernimmt und in die Sprache der Datenbank konvertiert.

Von Pro ASP.NET Design Patterns Buch.