Es posible (incluso probable) que simplemente no esté asimilando por completo el concepto de una "unidad de trabajo". Básicamente, lo veo como una especie de transacción amplia utilizada en un entorno orientado a objetos. Comience la unidad de trabajo, interactúe con los objetos, comprométase o retráigase. Pero, ¿cómo se relaciona esto con las transacciones reales en los almacenes de datos detrás de esos objetos?Unidad de trabajo con múltiples fuentes de datos?
En un sistema con una única base de datos y un ORM (como NHibernate) es fácil. La transacción se puede mantener a través del ORM. Pero, ¿qué ocurre con un sistema en el que los modelos de dominio personalizado ocultan muchas fuentes de datos dispares? Y no todas esas fuentes de datos son bases de datos relacionales? (Aquí se hace mucho en el sistema de archivos.)
En este momento estoy atascado en la idea de que "simplemente no se puede mantener una transacción en una base de datos SQL2005, una base de datos SQL2000, un DB de DB2 y el sistema de archivos todo en la misma operación comercial 'atómica'. " Por lo tanto, por ahora, es responsabilidad de los desarrolladores del equipo (que generalmente trabajan de forma independiente el uno del otro) mantener las transacciones manualmente en el código. Cada DB puede tener transacciones apropiadas en él, pero la operación del negocio como un todo se verifica manualmente y se balancea en cada paso significativo del camino.
Sin embargo, con la complejidad cada vez mayor en el dominio y la rotación del desarrollador estándar, este enfoque será cada vez más difícil y propenso a errores en el tiempo.
¿Alguien tiene algún consejo o ejemplos de cómo un dominio como este podría ser mejor abordado, o cómo se ha abordado antes? El "dominio" real en este caso todavía está en su infancia, evolucionando como un prototipo para expandir y consumir/reemplazar un gran ecosistema de aplicaciones legacy dispares. Así que hay mucho espacio para rediseñar y volver a factorizar.
Como referencia, una vista de 10,000 pies del diseño al que estoy apuntando actualmente es: una gran colección de pequeñas aplicaciones de cliente tan tontas como sea posible que llamen a un servicio central basado en mensajes. El servicio es la entrada al "núcleo del dominio" y puede considerarse como una gran aplicación de estilo MVC. Las solicitudes se hacen al servicio (al igual que las "acciones") que son recogidas por los controladores (al igual que los "controladores"). Todo lo procesal va allí. Interactúan con los modelos, que contienen todas las reglas comerciales. Los modelos publican eventos que los oyentes ("servicios", esta parte aún está nublada en el diseño y sujeto a mejoras) recogen y manejan mediante la interacción con repositorios (base de datos x, base de datos, sistema de archivos, correo electrónico, cualquier recurso externo). Todo alegremente, inyectado en dependencia en consecuencia.
Perdón por toda la verborrea :) Pero si alguien tiene algún consejo, me encantaría escucharlo. Incluso (especialmente) si ese consejo es "su diseño es malo, intente esto en su lugar ..." ¡Gracias!
¿Has consultado alguna vez al Coordinador de transacciones distribuidas? http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx –
@Michael: he tenido suerte al utilizar TransactionScope/MSDTC con soluciones SqlServer. Atravesar el sistema de archivos y otros RDBMS puede ser más complicado. OP está hablando de coordinar el trabajo sobre varios motores de base de datos así que es por eso que no estoy sugiriendo MSDTC como una respuesta. –