Il est possible (même probable) que je ne croque pas complètement le concept d'une «unité de travail». Fondamentalement, je le vois comme une sorte de transaction large utilisée dans un environnement orienté objet. Démarrer l'unité de travail, interagir avec les objets, valider ou annuler. Mais comment cela se décompose-t-il en transactions réelles dans les magasins de données derrière ces objets?Unité de travail avec plusieurs sources de données?
Dans un système avec un seul DB et un ORM (tel que NHibernate), c'est facile. La transaction peut être maintenue via l'ORM. Mais qu'en est-il d'un système où les modèles de domaines personnalisés masquent de nombreuses sources de données disparates? Et toutes ces sources de données ne sont-elles pas des bases de données relationnelles? (Actuellement, beaucoup de choses sont faites sur le système de fichiers.)
Actuellement, je suis bloqué sur l'idée que «vous ne pouvez simplement pas gérer une transaction sur une base de données SQL2005, une base de données SQL2000, une base de données DB2 et le système de fichiers tout dans la même opération commerciale «atomique». " Donc pour l'instant c'est la responsabilité des développeurs de l'équipe (qui travaillent généralement indépendamment les uns des autres) de maintenir les transactions manuellement dans le code. Chaque base de données peut avoir des transactions correctes, mais l'ensemble de l'activité commerciale est vérifiée manuellement et équilibrée à chaque étape significative du processus. Toutefois, avec la complexité croissante du domaine et le renouvellement standard des développeurs, cette approche deviendra de plus en plus difficile et susceptible d'entraîner des erreurs au fil du temps.
Quelqu'un a-t-il des conseils ou des exemples sur la meilleure façon d'aborder un domaine comme celui-ci, ou comment il a été traité auparavant? Dans ce cas, le «domaine» actuel en est encore à ses balbutiements, évoluant comme un prototype pour se développer un jour et consommer/remplacer un vaste écosystème d'applications héritées disparates. Il y a donc beaucoup de place pour re-concevoir et ré-factoriser. Pour référence, une vue de 10 000 pieds de la conception que je vise actuellement est: Une grande collection de petites applications client aussi stupides que possible appelant un service central basé sur les messages. Le service est l'entrée dans le «noyau de domaine» et peut être considéré comme une grande application de style MVC. Les demandes sont faites au service (un peu comme les «actions») qui sont récupérées par les gestionnaires (un peu comme les «contrôleurs»). Tout ce qui est procédural va là-bas. Ils interagissent avec les modèles, qui contiennent toutes les règles métier. Les modèles publient des événements dont les auditeurs ("services" - cette partie est encore trouble dans la conception et sujets à amélioration) relèvent et manipulent en interagissant avec les référentiels (base de données x, base de données y, système de fichiers, email, toute ressource externe). Toutes les dépendances joyeusement injectées en conséquence.
Désolé pour toute la verbosité :) Mais si quelqu'un a un conseil, j'aimerais l'entendre. Même (surtout) si ce conseil est "votre design est mauvais, essayez ceci à la place ..." Merci!
Avez-vous déjà consulté le coordinateur de transactions distribuées? http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx –
@Michael - J'ai eu de la chance en utilisant TransactionScope/MSDTC avec des solutions SqlServer uniquement. La répartition à travers le système de fichiers et les autres SGBDR peut être plus délicate. OP parle de coordonner le travail sur divers moteurs de base de données, c'est pourquoi je ne suggère pas MSDTC comme une réponse. –