Ho creato un framework applicativo utilizzando l'unità di lavoro e i modelli di repository per il suo livello dati. I livelli di consumer data come la presentazione dipendono dal design del livello dati. Ad esempio un modulo astratto CRUD ha una dipendenza da un repository (IRepository).
Questa architettura funziona come un fascino in ambienti client / server (ad esempio un'applicazione WPF e un server SQL). Ma sto cercando un buon modello per cambiare o riutilizzare questa architettura per un ambiente orientato ai servizi.
Certo che ho alcune idee:
Idea 1: il modello di progettazione "Adattatore"
Conserva l'architettura corrente e crea una nuova unità di lavoro e implementazione del repository che può funzionare con un servizio anziché con l'ORM. I consumatori del livello dati sono strettamente collegati al livello dati, quindi è possibile, ma il problema riguarda l'unità di lavoro; Devo creare un contesto che tiene traccia dello stato degli oggetti sul lato client e invia le modifiche al lato server chiamando "Commit" (Qualcosa che penso che l'RIA abbia fatto per Silverlight). Qui il diagramma:
----------- CLIENT----------- | ------------------ SERVER ----------------------
[ UI ] -> [ UoW/Repository ] ---> [ Web Services ] -> [ UoW/Repository ] -> [DB]
Idea 2: aggiungi un altro livello
Aggiungi un altro livello (diciamo "servizi locali" o "fornitore di dati"), quindi inseriscilo tra il livello dati (unità di lavoro e repository) e i livelli del consumatore di dati (come l'interfaccia utente). Quindi devo riscrivere le classi consumer (CRUD e altre classi che sono dipendenti da IRepository) per dipendere da un'altra interfaccia.
E il diagramma:
----------------- CLIENT ------------------ | ------------------- SERVER ---------------------
[ UI ] -> [ Local Services/Data Provider ] ---> [ Web Services ] -> [ UoW/Repository ] -> [DB]
Si noti che ho il livello dei servizi locali nell'architettura corrente ma non esporre la funzionalità del livello dati. In un'altra parola, il livello dell'interfaccia utente può comunicare con entrambi i livelli di dati e servizi locali, mentre il livello dei servizi locali utilizza anche il livello dati.
| | | | | |
| | ---> | Local Services | ---> | |
| UI | | | | Data |
| | | |
| | ----------------------------> | |