Pattern di deposito e query di database

7

Dopo aver letto altri post, mi sembra già che il concetto "repository" e "database" non vadano bene di pari passo, poiché sono pensati per essere concetti completamente separati .... ma chiederò domanda comunque.

Attualmente devo importare diversi tipi di dati (un tipo di dati può consistere di diverse migliaia di record) da diversi database che sono tutti diversi (oracle, sybase, sql server), elaborare i dati (a seconda del tipo del set di dati è) e quindi scrivere i dati elaborati in un database diverso. La lingua che sto usando ora è C #.

Mi è stato detto che l'utilizzo del pattern di repository nella mia situazione potrebbe rivelarsi utile, ma non sono sicuro su come programmarlo e, cosa più importante, dove posizionare tutte le query SQL parametrizzate in questo contesto. Avere così tanti prodotti diversi e diverse fonti di database contribuisce solo ad aumentare la mia confusione.

Per la ragione menzionata nel mio primo paragrafo, ho la sensazione che le mie query SQL dovrebbero far parte del mio livello di accesso ai dati, mentre i miei repository effettivamente vivono nei livelli precedenti. Sto sbagliando tutto questo? Il modello di repository è in realtà un modo terribile di risolvere il mio problema?

    
posta Iliana 11.01.2017 - 19:28
fonte

1 risposta

5

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.

    
risposta data 11.01.2017 - 21:09
fonte