qual è un buon approccio per lavorare con più database?

3

Sto lavorando su un progetto che ha un proprio database chiamandolo InternalDb, ma anche esegue una query su altri due database, chiamandoli ExternalDb1 ed ExternalDb2. Sia ExternalDb1 che ExternalDb2 sono effettivamente richiesti da alcuni altri progetti. Mi chiedo quale sia l'approccio migliore per affrontare questo aspetto?

Attualmente, ho appena creato un progetto per ciascuno di questi database esterni e poi generato Edmx ed entità utilizzando l'approccio entity-framework. Il mio pensiero era che potessi quindi includere questi progetti in una delle mie soluzioni che richiedono l'accesso a questi database. Inoltre, non ho livelli aziendali separati. Ho solo una soluzione come di seguito:

Project.Domain
ExternalDb1Project.Domain
ExternalDb2Project.Domain
Project.Web

Quindi i miei progetti di dominio contengono l'accesso ai dati così come i POCO generati da Entity Framework e qualsiasi logica aziendale. Ma non sono sicuro che questo sia un buon approccio. Ad esempio, se voglio fare la convalida nel mio Project.Domain sulle entità in InternalDb, va bene. Ma se voglio fare Validation per entità da uno dei due ExternalDbs, allora mi chiedo dove dovrebbe andare? Per essere più specifici, recupero i dipendenti da ExternalDb1Project.Domain. Tuttavia, voglio essere sicuro che siano attivi. Dove dovrebbe andare questa convalida?

Come progettare un progetto come questo ad alto livello? Inoltre, voglio essere certo di utilizzare IoC per i miei contesti dati in modo da poter creare Fakes durante la scrittura dei test. Mi chiedo dove risiederanno le interfacce per questi vari contesti di dati?

    
posta Riz 27.06.2013 - 20:24
fonte

3 risposte

2

Potresti trattarli come risorse indipendenti. Cioè, fai ciò che hai fatto, ma continua esponendo i dati tramite un servizio. Quindi, anziché includere i riferimenti al progetto nei progetti client, includi riferimenti al servizio.

Quindi, qualunque sia la convalida richiesta dai dati viene eseguita nel servizio e qualsiasi logica di convalida è richiesta solo nel / dal client viene eseguita nel client.

Dipende dai tuoi dati / clienti / sicurezza / volume / requisiti di connettività per quanto riguarda il tipo di servizio che vuoi esporre (OData / REST / etc).

    
risposta data 27.08.2013 - 01:54
fonte
2

Sembra che il tuo dominio sia diviso solo perché le informazioni si trovano in più database. Se è presente un oggetto dominio (Employee), il dominio deve esporre un'unica fonte per i dipendenti e le origini dati multiple devono essere aggregate per presentare un singolo Dipendente al resto del sistema (incluso un metodo di convalida). Posso pensare a due modi per realizzare questo:

1) Se più servizi dovranno accedere alle origini dati, potresti avere un servizio davanti a ciascun database:

EmployeeInfoService -> EmployeeInfoRepository -> db1
EmployeeRoleService -> EmployeeRoleRepository -> db2

EmployeeService -> depends on EmployeeInfoService and EmployeeRoleService
SomeOtherService -> depends on EmployeeInfoService
SomeOtherServiceTwo -> depends on EmployeeRoleService

2) Se l'entità dipendente è l'unica parte interessata nelle informazioni:

EmployeeRepository -> direct queries to db1 and db2
EmployeeService -> depends on EmployeeRepository
SomeOtherService -> depends on EmployeeService
SomeOtherServiceTwo -> depends on EmployeeService

I database multipli dovrebbero essere solo un problema solo nel repository e nel livello di archiviazione. Rivisitare la separazione dei livelli se l'archiviazione del database ha un impatto sul servizio di convalida.

    
risposta data 23.02.2014 - 06:28
fonte
0

if I want to do Validation for entities from either of the ExternalDbs, then I wonder where it should go. To be more specific, I retrieve Employees from ExternalDb1Project.Domain. However, I want to make sure they are Active. Where should this Validation go?

Dipende se è necessaria la stessa convalida da qualsiasi altro progetto che accede allo stesso database e modello. In tal caso, potresti semplicemente creare un progetto ExternalDb1Project.Domain.MetaData per contenere metadati e convalida.

Se non richiesto da altri progetti, perché "Attivo" significa una cosa totalmente diversa dalla tua applicazione rispetto ad un'altra applicazione che accede allo stesso database, potresti inserirla nel tuo progetto come Project.ExternalDb1Project.MetaData .

    
risposta data 27.06.2013 - 20:32
fonte