E 'possibile (anche probabile) che io non stia completamente del tutto il concetto di "unità di lavoro". Fondamentalmente, lo vedo come una sorta di ampia transazione utilizzata in un ambiente orientato agli oggetti. Avvia l'unità di lavoro, interagisci con gli oggetti, esegui il commit o esegui il rollback. Ma come si analizzano le transazioni effettive negli archivi dati dietro quegli oggetti?Unità di lavoro con più origini dati?
In un sistema con un singolo DB e un ORM (come NHibernate) è facile. La transazione può essere gestita tramite l'ORM. Ma che dire di un sistema in cui i modelli di domini personalizzati stanno oscurando molte fonti di dati disparate? E non tutte queste fonti di dati sono database relazionali? (C'è molto lavoro sul file system da queste parti.)
In questo momento sono bloccato sull'idea che "semplicemente non è possibile mantenere una transazione attraverso un DB SQL2005, un DB SQL2000, un DB2 DB e il file system è tutto nella stessa operazione aziendale "atomica". " Quindi per ora è responsabilità degli sviluppatori del team (che generalmente lavorano indipendentemente l'uno dall'altro) per mantenere le transazioni manualmente nel codice. Ogni DB può avere transazioni corrette su di esso, ma l'operazione aziendale nel suo complesso viene controllata manualmente e bilanciata in ogni fase significativa del percorso.
Tuttavia, con l'aumento della complessità nel dominio e il turnover degli sviluppatori standard, questo approccio diventerà sempre più difficile e soggetto ad errori nel tempo.
Qualcuno ha qualche consiglio o esempio su come un dominio come questo potrebbe essere meglio indirizzato, o come è stato affrontato in precedenza? L'attuale "dominio" in questo caso è ancora molto nella sua infanzia, evolvendosi come prototipo per un giorno espandere e consumare/sostituire un ampio ecosistema di disparate applicazioni legacy. Quindi c'è molto spazio per riprogettazione e ri-factoring.
Per riferimento, una vista di 10.000 piedi del progetto al quale sto puntando attualmente è: Una vasta raccolta di piccole applicazioni client asimmetriche che chiamano un servizio centrale basato sui messaggi. Il servizio è l'ingresso nel "dominio core" e può essere pensato come una grande applicazione in stile MVC. Le richieste vengono fatte al servizio (proprio come "azioni") che vengono raccolte dai gestori (proprio come i "controllori"). Tutto procedurale va lì. Interagiscono con i modelli, che contengono tutte le regole aziendali. I modelli pubblicano eventi che gli ascoltatori ("servizi" - questa parte è ancora torbida nella progettazione e soggetti a miglioramenti) prendono e gestiscono interagendo con i repository (database x, database y, file system, email, qualsiasi risorsa esterna). Tutto allegramente dipendente di conseguenza.
Scusate per la verbosità :) Ma se qualcuno ha qualche consiglio, mi piacerebbe sentirlo. Anche (soprattutto) se quel consiglio è "il tuo design è brutto, prova questo invece ..." Grazie!
Hai mai consultato il Distributed Transaction Coordinator? http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx –
@ Michael - Ho avuto fortuna usando TransactionScope/MSDTC con soluzioni SqlServer-only. Spanning attraverso il file system e altri RDBMS potrebbe essere più complicato. OP sta parlando di coordinare il lavoro su vari motori db, ecco perché non sto suggerendo MSDTC come risposta. –