Organizzazione dell'accesso ai dati per l'iniezione delle dipendenze

2

Nella nostra azienda abbiamo una storia relativamente lunga di applicazioni database supportate, ma abbiamo appena iniziato a sperimentare con l'iniezione di dipendenza. Sto cercando consigli su come convertire il nostro schema di accesso ai dati esistente in uno più adatto per l'iniezione delle dipendenze.

Alcune domande specifiche:

Crei un oggetto di accesso per tabella (Dato che una tabella rappresenta una raccolta di entità)? Un'interfaccia per tabella? Tutti questi avrebbero bisogno di iniettare l'oggetto Data Access di basso livello, giusto?
Che dire se ci sono dozzine di tabelle, non renderebbe la composizione radice in un incubo?

Avresti invece una singola interfaccia che definisce cose come GetCustomer() , GetOrder() , ecc?

Se prendessi l'esempio di EntityFramework, allora avrei un Container che espone un oggetto per ogni tabella, ma quel contenitore non è conforme a nessuna interfaccia, quindi non sembra compatibile con DI.

Cosa facciamo ora, nel caso in cui aiuti:

Il modo in cui normalmente gestiamo l'accesso ai dati avviene attraverso un livello dati generico che espone funzionalità CRUD / Transaction e ha sottoclassi specifiche del provider che gestiscono la creazione di IDbConnection , IDbCommand , ecc.

L'accesso alla tabella effettiva utilizza le classi Table che eseguono le operazioni CRUD associate a una determinata tabella e accettano / restituiscono gli oggetti dominio che il resto del sistema gestisce. Queste classi di tabelle espongono solo metodi statici e utilizzano un singleton statico DataAccess istanziato da un file di configurazione.

    
posta IanAWP 08.04.2014 - 06:56
fonte

1 risposta

1

In genere preferisco vedere le interfacce (e le iniezioni) che descrivono le azioni che possono essere eseguite sul dominio piuttosto che il semplice accesso ai dati. Ad esempio, preferirei vedere un'interfaccia Customer che dà accesso ai dati dei clienti senza rivelare la struttura dati sottostante invece di fornire solo operazioni CRUD.

Ma poi di nuovo, dipende da quale livello di astrazione sei. A un certo punto, è necessario accedere alle operazioni CRUD di livello inferiore. E sì, potresti voler iniettare gli oggetti reali che interagiscono con il database.

Quando ho usato Entity Framework 4 per un progetto precedente, avevamo alcune limitazioni di test, quindi abbiamo spostato tutto il codice per le query del database effettive in classi "sottili" prive di logica condizionale. Quindi abbiamo finito per affidarci direttamente agli oggetti del contratto EF e non li abbiamo iniettati. Invece abbiamo iniettato un'astrazione che ha funzionato su quegli oggetti.

Quindi ... per il tuo scenario, potresti provare a creare alcune classi "wrapper" che forniscono l'interfaccia che vuoi esporre tramite iniezione. Oppure è anche possibile modificare la generazione del codice EF per farlo (anche se ho dimenticato come farlo ...)

    
risposta data 08.04.2014 - 07:12
fonte

Leggi altre domande sui tag