Oop 设计问题:系统中不同类型的事务

Oop 设计问题:系统中不同类型的事务,oop,interface,Oop,Interface,在framewrok中,我有一个ITransaction接口。 它实现一些基本操作,如Commit()和Rollback(),用于平面文件和其他数据源。 但是NHibernate也有一个ITransaction接口。 它与我的界面不同,因为有一些特定于数据库的方法,但也有相似之处。 我的问题是,我希望NHibernate事务与我自己的事务一样,这样我就能够更轻松地在数据库和平面文件之间切换实现。 如何组合这两个接口,使NHibernate仍能接受我的NHibernate事务对象,而我的框架也能接

在framewrok中,我有一个ITransaction接口。
它实现一些基本操作,如Commit()和Rollback(),用于平面文件和其他数据源。
但是NHibernate也有一个ITransaction接口。
它与我的界面不同,因为有一些特定于数据库的方法,但也有相似之处。
我的问题是,我希望NHibernate事务与我自己的事务一样,这样我就能够更轻松地在数据库和平面文件之间切换实现。

如何组合这两个接口,使NHibernate仍能接受我的NHibernate事务对象,而我的框架也能接受我的NHibernate事务对象,因为它们属于MyFramework.ITransaction?

您是否有一个公共基类,可以实现这两个NHibernate.ITransaction,还有MyFramework.ITransaction?我不知道我会创建一个公共基类仅仅是为了实现这两个接口,但是如果你已经因为其他原因有了一个公共基类,为什么不呢

MyFramework.ITransaction可以从NHIbernate.ITransaction继承,确保MyFramework.ITransaction的所有实现者也将是NHIbernate.ITransaction的实现者


最后,您可以使用一个iTransactionWrapper和两个实现者(MyFrameworkTransactionWrapper和NHibernateTransactionWrapper)实现一个适配器模式。所有代码都将写入ITransactionWrapper接口,其实现者将调用委托给正确的ITransaction。与大多数适配器模式实现一样,您可能会在运行时使用Factory或AbstractFactory模式来创建正确的包装器,具体取决于配置。

MyFramework.ITransaction不能与NHibernate.ITransaction具有相同的接口,因为NHibernate.ITransaction具有特定于DB的方法。如何为接口实现适配器模式?我的答案包含适配器模式的基本内容(请参阅ITransactionWrapper),但我将尝试进行一些扩展:假设NHibernate.ITransaction定义SaveToDB()函数,而ITransaction接口定义SaveToFile()。您希望所有代码只需调用Save()。ITransactionWrapper将定义Save()。MyFrameworkWrapper将实现Save(),作为对其包装对象SaveToFile()的调用。您的NHibernateWrapper将实现Save(),作为对其包装对象SaveToDB()的调用。调用代码永远不必知道包装了哪个对象。它只调用Save()。注意:上面我的对象命名非常快且脏-您不想命名接口ITransactionWrapper,因为“wrapper”描述了一个实现。ITransactable或ISaveable可能是更好的名称,但仍然不完美。NHibernate有一种在其他交易中不存在的行为。我用几种不同的方式处理了这种情况。该行为是否表示一种逻辑抽象,将其包含在ITransactionWrapper中有意义?例如,如果NHibernate有一个InitializeDB()函数,那么您的ITransactionWrapper可能应该定义一个initialized()函数。另外,考虑一下这个函数是否需要被你的“外部”代码调用。也许它没有公开在您的外部接口上,但是作为某些其他实现的一部分被您的包装器类调用。