Perché Query Object Design Pattern

Sto cercando di capire la “Query object design pattern”. Io non sono in grado di trovare buone e semplici esempi per esso. Qualcuno potrebbe aiutarmi a capire che cosa questo modello di progettazione è e in che cosa il problema siamo in grado di realizzare questo?

InformationsquelleAutor | 2013-07-24

 

3 Replies
  1. 35

    Query design pattern di solito è usato in combinazione con il deposito di un modello di progettazione.

    Andiamo con un esempio e poi mi darà un bell’articolo da leggere. Diciamo che abbiamo un database dove vengono memorizzate le informazioni sui nostri clienti e i loro ordini, etc.

    Poi creiamo un iniziale repository come questo:

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

    Come si può vedere per ogni query che abbiamo creato un metodo di repository che è molto fine e per il limitato numero di query, ma quando ci sono un sacco di loro, e iniziano sempre complicato, con un sacco di combinazioni (es. farmi i clienti con gli acquisti che superano i 1000 e vive a New York e il loro limite di credito è a meno di 3000) quindi la conclusione di un lungo elenco di metodi e anche peggio, perde qualche logica di business a forma di query all’interno della repository che non vogliamo che accada.

    Così il refactoring di cambiare i repository di qualcosa di simile a questo:

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

    Come potete vedere stiamo passando un Oggetto Query che rappresenta la query sotto forma di un oggetto e il repository ha un solo e unico repository per l’esecuzione di query e ci danno i risultati.

    Ora come implementare tale oggetto query e come costruire questo richiederà un sacco di codice e quindi a questo punto voglio diretta di questa bell’articolo. È in C# ma si troverà molto utile, anche si può guardare la Criteri di API (Java) che è utilizzato da NHibernate per vedere diversi, ma simili attuazione.

    • ok, ho capito l’esatto uso della query object design pattern ora. Bell’esempio e bello explanaiton.Vi ringrazio tanto. E ora ho un’altra domanda relativa a questo. I criteri di API fornisce la query object design pattern e semplicemente siamo in grado di utilizzarlo. Ma po ‘ confuso sull’implementazione di questo a livello di programmazione. Nell’esempio di cui sopra, si sta iniettando l’oggetto Query. Ma come si fa se voglio realizzare nella mia app?
    • In che linguaggio stai usando e hai controllato l’articolo in C# che ti ho detto ?
    • Sto usando Java. Ho controllato il C#. Ma ho pensato a come utilizzare questo modello per il DAO chiamate le diverse individuyal operazioni CRUD.
    • Non è necessario che per semplici operazioni CRUD come aggiungere, aggiornare, cancellare e leggere. Hai solo bisogno di questo per query complesse.
    • Che cosa succede se abbiamo bisogno di estrarre i dati di due tabelle diverse? come un cliente repository tirando solo i dati della tabella Clienti essere utile in uno scenario reale?
    • Non si limitano ad accedere a una tabella per ogni repository. In realtà è preferibile utilizzare un repository per aggregato di root, se volete che carichi l’entità e le sue entità figlio.
    • Ottima Risposta!!!

  2. 6

    Query Oggetto rappresentato una query scritta nella lingua del dominio e stato di attuazione del Query Object pattern. L’Oggetto Query modello, come descritto da Fowler è “un oggetto che rappresenta una query al database.” Senza un meccanismo di interrogazione, il Repository sarebbe stata inondata da una miriade di metodi di recupero, come può essere visto 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 qualsiasi query per essere costruito e quindi inviato al Repository di essere soddisfatto. Il vantaggio principale dell’Oggetto Query motivo è che è completamente abstract distanza di database sottostante linguaggio di query e quindi mantiene l’infrastruttura preoccupazioni della persistenza dei dati e il recupero di livello aziendale. A un certo punto, tuttavia, il crudo linguaggio di query di database deve essere creato; questo si ottiene utilizzando un database specifico QueryTranslator che prende gli Oggetti Query e li converte in linguaggio di database.

    Da Pro ASP.NET Modelli di Progettazione libro.

Lascia un commento