2013-07-24 17 views
16

Sto cercando di capire il "modello di progettazione dell'oggetto di query". Non sono in grado di trovare esempi validi e semplici. Qualcuno potrebbe aiutarmi a capire a cosa serve questo modello di progettazione e in quale problema possiamo implementarlo?Motivo di progettazione dell'oggetto di query

+0

http: // StackOverflow.it/questions/2068478/query-object-pattern-design-pattern – Bart

risposta

25

Il modello di progettazione Query viene in genere utilizzato in combinazione con il modello di progettazione del repository.

Lasciaci andare con un esempio e poi darò un bel articolo da leggere. Diciamo che abbiamo un database in cui archiviamo informazioni sui nostri clienti e le loro ordini, ecc

Poi creiamo un repository iniziale in questo modo:

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

Come si può vedere per ogni query, abbiamo creato un metodo nel repository che è molto fine e bene per un numero limitato di query ma quando ne abbiamo molte e cominciano a complicarsi con molte combinazioni (ad esempio, procurami clienti con acquisti superiori a 1000 e viviamo a New York e il loro limite di credito è inferiore a 3000) quindi ci ritroveremo con una lunga lista di metodi e ancora peggio, perdendo qualche logica di business sotto forma di quer all'interno dei repository che non vogliamo accadere.

Così il refactoring che cambiamo il repository per qualcosa di simile:

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

Come si può vedere che stiamo passando un oggetto Query che rappresenta la nostra query nella forma di un oggetto e il repository ha un solo repository per eseguire quella query e restituirci i risultati.

Ora come implementare quell'oggetto di query e come crearlo richiederà molto codice, quindi a questo punto ti indirizzerò a questo nice article. È in C# ma lo troverai molto utile, puoi anche guardare lo Criteria API (Java) che viene utilizzato da NHibernate per vedere un'implementazione diversa ma simile.

+0

ok, capisco l'uso esatto del modello di progettazione dell'oggetto query ora. Bel esempio e bella explanaiton. Grazie mille. E ora ho un'altra domanda relativa a questo. L'API dei criteri fornisce il modello di progettazione dell'oggetto query e semplicemente possiamo usarlo. Ma un po 'confuso sull'implementazione di questo programma. Nell'esempio sopra menzionato, stai iniettando l'oggetto Query. Ma come appare se voglio implementarlo nella mia app? –

+1

@santu Che lingua stai usando e hai controllato l'articolo in C# di cui ti ho parlato? –

+0

Sto usando Java. Ho controllato C#. Ma ho pensato a come utilizzare questo modello solo per le chiamate DAO che fanno le diverse operazioni CRUD individuali. –

4

L'oggetto Query rappresentava una query scritta nella lingua del dominio ed era un'implementazione del modello Oggetto query. Il modello oggetto Query come descritto da Fowler è “un oggetto che rappresenta una query.” Senza qualche meccanismo di interrogazione, Repository sarebbe inondato con metodi di recupero miriade come si può vedere in questo frammento di codice:

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

Invece, l'oggetto Query consente di costruire qualsiasi query e quindi di inviarla al repository per essere soddisfatta. Il principale vantaggio del modello Query Object è che astrae completamente il linguaggio di query del database sottostante e mantiene quindi i problemi di infrastruttura della persistenza e del recupero dei dati dal livello aziendale. Ad un certo punto, tuttavia, è necessario creare il linguaggio di query raw del database; questo viene ottenuto utilizzando un QueryTranslator specifico del database che prende gli oggetti di query e li converte nella lingua del database.

Dal libro Pro Pattern di progettazione ASP.NET.

Problemi correlati