18

Esempio: il database ha una vista SQL denominata "CustomerOrdersOnHold". Questa vista restituisce un mix filtrato di specifici campi dati cliente e ordine. Devi recuperare i dati da questa vista nella tua applicazione. In che modo l'accesso a tale vista si inserisce nel modello di repository? Vuoi creare un "CustomerOrdersOnHoldRepository"? Una vista di sola lettura come questa è considerata una radice aggregata?In che modo le viste del database di sola lettura si adattano al pattern del repository?

risposta

24

io preferirei che separa la repository di lettura, di preferenza anche cambiare il suo nome al Trovatutto o Reader, il repository è destinata per l'utilizzo del dominio non per l'interrogazione di dati di sola lettura, è possibile fare riferimento a this article e this che spiega l'utilizzo del repository di moduli separati da Finder.

lo consiglio anche la separazione del modello di lettura dal modello di scrittura dell'architettura CQRS e there

Questa architettura permette di separare il modello di lettura da modello di scrittura, anche in termini di memorizzazione dei dati e l'uso di approvvigionamento evento.

Per una soluzione di mezzo si può utilizzare alcuni CQRS concetti senza la complessità di separare banca dati, semplicemente separando repository da cercatori, leggere questo post

per un campione di questo tipo di soluzione (utilizzare lo stesso database, ma cercatori di separazione form repository) check this sample

+0

Penso che questa sia la migliore risposta. Questo tipo di dati/oggetti non ha nulla a che fare con il dominio e, come ha rilevato Mohamed, il termine repository è associato a aggregati/dominio/transazioni, quindi l'uso di questo termine potrebbe essere fuorviante. CQRS ha lo scopo di risolvere questo problema esatto. Ho fatto una domanda simile qualche tempo fa: http://stackoverflow.com/questions/2098112/ddd-how-to-implement-performant-repositories-for-searching –

+0

Ottima risposta grazie agli ottimi link. Questo mi ha aiutato a vedere il mio codice da una prospettiva diversa e più chiara. –

+0

Se si dispone di un Finder, come si chiama "Saver"? Repository? Ma poi un repository dovrebbe essere in grado di accedere ai dati "query" AKA ... come affrontare questo? – JorgeeFG

0

Penso che sia corretto avere un repository separato come "CustomerOrdersOnHoldRepository". L'interfaccia del repository rifletterà il fatto che gli oggetti sono in sola lettura (non definendo il metodo Save/Add/MakePersistent).

Da How to write a repository:

... Ma v'è un'altra strategia che mi piace molto: multipla Repositories. Nel nostro esempio di ordine non c'è ragione per cui possiamo avere due repository: AllOrders e SurchargedOrders. AllOrders rappresenta un elenco contenente ogni singolo ordine nel sistema, SurchargedOrders rappresenta un sottoinsieme di esso.

Non chiamerei oggetto restituito radice di Aggrgate. Gli aggregati sono per coerenza, scambio di dati e cicli di vita. I tuoi oggetti non hanno nessuno di questi. Sembra che anche loro non possano essere classificati come oggetti valore ('caratteristica o attributo'). Sono solo classi indipendenti.

+0

Ero propenso a dare il punto di vista al proprio repository, tuttavia, è a mia conoscenza che i repository operano solo su radici aggregate (http://thinkddd.com/glossary/aggregate-root/). –

+0

Questa regola riguarda l'eliminazione dell'accesso diretto alle parti interne dell'aggregato. Non hai queste parti interne, proprio come non hai invarianti e ciclo di vita. Va bene restituire questi oggetti dal repository. Chiamali Radici aggregate, se vuoi, ma può essere un po 'fuorviante. – Dmitry

0

I dati di sola lettura sono considerati oggetti valore nel mondo DDD.

In genere inserisco metodi di accesso per oggetti valore negli archivi esistenti fino a quando non ha senso creare un repository separato. E 'simile a un metodo che potrebbe restituire un elenco statico di stati per essere utilizzato su un modulo di indirizzo:

IAddressRepository 
{ 
    Address GetAddress(string addressID); 

    List<string> GetStates(string country); 
} 
+0

Quindi nel tuo scenario, se ho un CustomerRepository o un OrderRepository aggiungerei un metodo a uno di questi repository? Ad esempio: ICustomerRepository.GetCustomerOrdersOnHold (args) 'o' IOrderRepository.GetCustomerOrdersOnHold (args) '? –

Problemi correlati