I miei 2 centesimi: un database è un database. Un repository è qualcosa che astrarrà il concetto del database per te.
Quando diciamo database, viene direttamente in mente alcune parole chiave come MS SQL Server, Oracle, DB2, MySQL, PostgreSQL.
Ma se si espande un po 'il concetto, un database è un luogo in cui è possibile inserire i record, di solito in modo strutturato, e si eseguono query su questi record.
In questo senso, un database può essere una directory nel tuo file system, con una manciata di file di testo divisi, ogni file di testo con più righe, ogni riga che rappresenta un singolo record, per esempio.
Detto questo, che cos'è un deposito allora? Un repository è un livello più alto di astrazione, sopra il database. È dove archivi, recuperi e chiedi oggetti, da qualche luogo magico, di cui la tua applicazione potrebbe non essere completamente al corrente.
Esempio concreto: supponiamo di avere record di 3 diversi tipi: Car, TrafficTicket e Person. Si riferiscono l'un l'altro nello schema seguente:
- Una persona ha zero o molte macchine;
- Un'auto ha zero o più biglietti del traffico;
Inoltre, hanno questi attributi:
- Person {Name, SSN} = SSN è un identificativo univoco.
- Car {OwnerSSN, LicensePlate} = License Plate è un identificativo univoco.
- TrafficTicket {Id, LicensePlate, Severity, Points, Value} = Id è un identificativo univoco.
Fin qui tutto bene, vero?
Ora, immagina di avere un enorme database di Traffic Ticket, fornito come file di testo che puoi scaricare da qualche parte. Niente di illegale, ovviamente.
Inoltre, hai in-house un Database Oracle dove hai una lista di Persone (ognuna delle quali è un dipendente della tua azienda).
Inoltre, hai un elenco di Cars che puoi richiedere da un partner che ti ha dato accesso diretto al suo database MySQL.
Il tuo manager, un bravo ragazzo - con un po 'di oscuro background etico - ti chiede di fargli una relazione su quanti dei suoi impiegati hanno un brutto record di guida. Vuole usarlo per sfruttare i parcheggi nel parcheggio della compagnia, e lui ti minaccia di fornirgli questo rapporto O ALTRO ...
La trama si infittisce. Hai poco tempo per fare il tuo rapporto. Le bollette della tua casa stanno scadendo e tu hai una famiglia da crescere (cosa farà il piccolo Ben senza i suoi cereali del mattino?). Quindi decidi di far fronte al gestore ombroso, e segnalarlo all'FBI in seguito. Dopo tutto, è bello avere qualche sfida tecnica qua e là.
Quindi decidi di creare un progetto C #, perché sei intelligente, fico, e conosci LINQ-fu. E strutturi il tuo progetto come segue:
I namespace:
ShadyReport.TextFiles.DAL
TrafficTicketReader.cs
public List<TrafficTicket> GetAllTrafficTicketsFromTextFile(string pathOfCompletelyLegalTextFile)
ShadyReport.Oracle.DAL
EF6OracleContext.cs *(your Entity Framework Oracle DB Context)*
ShadyReport.MySQL.DAL
EF6MySQLContext.cs *(your Entity Framework MySQL DB Context)*
ShadyReport.Repository
PersonRepository.cs
public List<Person> GetAllPersons()
CarRepository.cs
public List<Car> GetCarsOfPersons(List<Person> persons)
TrafficTicketRepository.cs
public List<TrafficTicket> GetTrafficTicketsOfCars(List<Car> cars)
ShadyReport.Entity
TrafficTicket.cs *(simple POCO object)*
Person.cs *(simple POCO object)*
Car.cs *(simple POCO object)*
ShadyReport.Business
ShadyReportGenerator.cs
public void GenerateShadyReport()
Suppongo che tu sappia come lavorare con Entity Framework qui e che tu capisca che diversi DBContexts possono avere ConnectionString differenti, ognuno dei quali punta a un database diverso.
Detto questo, ecco come sarà il tuo metodo GenerateShadyReport ():
public void GenerateShadyReport()
{
var personRepository = new ShadyReport.Repository.PersonRepository();
var carRepository = new ShadyReport.Repository.CarRepository();
var ticketRepository = new ShadyReport.Repository.TrafficTicketRepository();
var persons = personRepository.GetAllPersons();
var cars = carRepository.GetCarsOfPersons(persons);
var tickets = ticketRepository.GetTrafficTicketsOfCars(cars);
var shadyReport = <LINQ magic stuff to tie the objects above together>
}
Come puoi vedere, il tuo generatore di rapporti non sa da dove provengano i dati. Dal punto di vista del generatore di report, il database è un concetto inesistente, poiché recupera i dati dai repository.
Detto questo, le tue query parametriche specifiche dovrebbero andare nei tuoi repository specifici. Una query che filtra le automobili da persone deve trovarsi nel repository Cars, mentre una query che collega elementi provenienti da origini diverse viene eseguita nel livello aziendale, sopra i repository. Ecco come appaiono:
+-----------------+---+
| UI | E |
+-----------------+ n |
| Business | t |
+-----------------+ i |
| Repository | t |
+-----------------+ y |
| DAL | |
+-----------------+---+
E il grafico delle chiamate è sempre in un modo: GIÙ. L'interfaccia utente chiama Business, che chiama Repository, che chiama i DAL. E tutti "parlano" le entità.
Spero che questo aiuti. NON È LA RISPOSTA DEFINITIVA sui repository, ma questo tipo di risposte di solito mi aiuta a capire i concetti.