2010-07-27 4 views
0

Dans mon framewrok j'ai une interface ITransaction.
Il implémente certaines opérations de base comme Commit() et Rollback(), il est utilisé pour les fichiers plats et d'autres sources de données.
Cependant, NHibernate possède également une interface ITransaction.
Ce n'est pas la même chose que mon interface car il existe des méthodes spécifiques à la base de données, mais il existe des similitudes.
Mon problème est que je veux qu'une transaction NHibernate soit considérée comme ma propre transaction afin que je puisse changer plus facilement les implémentations entre la base de données et les fichiers plats.
Comment puis-je combiner les deux interfaces pour que NHibernate puisse toujours accepter mes objets de transaction NHibernate et mon framework puisse accepter mes objets de transaction NHibernate parce qu'ils appartiennent à MyFramework.ITransaction?Question de conception: Différents types de transactions dans un système

Répondre

1

Avez-vous une classe de base commune, qui pourrait implémenter à la fois NHibernate.ITransaction et MyFramework.ITransaction? Je ne sais pas que je créerais une classe de base commune pour la seule raison d'implémenter ces deux interfaces, mais si vous avez déjà une classe de base commune pour d'autres raisons, pourquoi pas?

MyFramework.ITransaction pourrait hériter de NHIbernate.ITransaction, en s'assurant que tous les implémenteurs de MyFramework.ITransaction seraient également implémenteurs si NHibernate.ITransaction. Enfin, vous pouvez implémenter un modèle d'adaptateur, avec un ITransactionWraper, et 2 implémenteurs (MyFrameworkTransactionWrapper et NHibernateTransactionWrapper). Tout votre code serait écrit dans l'interface ITransactionWrapper, et ses implémenteurs délégueraient des appels à l'ITransaction correcte. Comme la plupart des implémentations de modèle d'adaptateur, vous utiliserez probablement un modèle Factory ou AbstractFactory pour créer le wrapper correct lors de l'exécution, comme dicté par la configuration.

+0

MyFramework.ITransaction ne peut pas avoir la même interface que NHibernate.ITransaction puisque NHibernate.ITransaction a des méthodes spécifiques à la base de données. Comment implémenteriez-vous un modèle d'adaptateur pour les interfaces? –

+0

Ma réponse contient les bases du modèle Adapter (voir ITransactionWrapper), mais je vais essayer de développer un peu: supposons que NHibernate.ITransaction définit la fonction SaveToDB(), et que votre interface ITransaction définisse SaveToFile(). Vous voulez que tout votre code appelle simplement Save(). Votre ITransactionWrapper définirait Save(). Votre MyFrameworkWrapper implémenterait Save() comme un appel à son objet enveloppé SaveToFile(). Votre NHibernateWrapper implémenterait Save() en tant qu'appel à son objet enveloppé SaveToDB(). Votre code d'appel n'a jamais besoin de savoir quel objet est enveloppé. Il appelle simplement Save(). – mikemanne

+0

note: mon nom d'objet ci-dessus est très rapide et sale - vous ne voudriez pas nommer une interface ITransactionWrapper, car "wrapper" décrit une implémentation. ITransactable ou ISaveable seraient de meilleurs noms, mais pas encore parfaits. – mikemanne

Questions connexes