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
risposta
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.
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? –
@santu Che lingua stai usando e hai controllato l'articolo in C# di cui ti ho parlato? –
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. –
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.
Dai un'occhiata alla biblioteca modello oggetto query che ho scritto per NHibernate: https://github.com/shaynevanasperen/NHibernate.Sessions.Operations
- 1. Motivo di progettazione "Facciata"
- 2. Motivo di progettazione MapMaker?
- 3. Motivo di progettazione per flusso di lavoro
- 4. java: motivo di progettazione per risultati paginati
- 5. Quale motivo di progettazione utilizza Codeigniter?
- 6. Motivo di progettazione per gli aggiornamenti software
- 7. Motivo di progettazione per l'oggetto dinamico C#
- 8. Motivo di progettazione MVC, scopo del livello di servizio?
- 9. Motivo di progettazione per il livello di accesso ai dati
- 10. Motivo di progettazione da utilizzare in modalità Anteprima?
- 11. Motivo di progettazione per il filtraggio degli oggetti
- 12. Un buon motivo per utilizzare il modello di progettazione Visitor?
- 13. Delphi 2010 Datasnap - Query di progettazione
- 14. Java, Motivo di progettazione: più origini di eventi e un gestore di eventi One
- 15. Eccezione "query non valida" senza motivo chiaro
- 16. Eventi e delegati. Che motivo di design?
- 17. Motivo di progettazione per un'applicazione di database che deve essere disconnessa
- 18. quale motivo di progettazione viene utilizzato per la classe TestRunner in junit
- 19. Esiste un nome per questo motivo di progettazione (che si avvolge dinamicamente attorno ad un'altra classe)?
- 20. Motivo di progettazione? Funzione iterando attraverso un elenco alla ricerca del primo risultato {successo}
- 21. Esiste un motivo di progettazione per cui std :: set non ha funzioni membro anteriore e posteriore?
- 22. domanda di progettazione OOP
- 23. Motivo decorativo in C++
- 24. Motivo logico alla base di STL
- 25. Progettazione di classe std :: ifstream
- 26. Modelli di progettazione messaggio
- 27. Modelli di progettazione JavaScript
- 28. Progettazione modello di errore
- 29. Modelli di progettazione SQL
- 30. Modello di progettazione lavoratore
http: // StackOverflow.it/questions/2068478/query-object-pattern-design-pattern – Bart