2010-07-27 58 views
0

在我的framewrok中,我有一個ITransaction接口。
它實現了一些基本的操作,如Commit()和Rollback(),它用於平面文件和其他數據源。
然而NHibernate也有一個ITransaction接口。
它與我的界面不一樣,因爲有一些數據庫特定的方法,但有相似之處。
我的問題是,我想要一個NHibernate事務被認爲是我自己的事務,所以我將能夠更輕鬆地在數據庫和平面文件之間切換實現。
如何組合兩個接口,使NHibernate仍然能夠接受我的NHibernate事務對象,並且我的框架將能夠接受我的NHibernate事務對象,因爲它們屬於MyFramework.ITransaction?設計問題:系統中不同類型的交易

回答

1

你有一個共同的基類,它可以實現NHibernate.ITransaction和MyFramework.ITransaction?我不知道爲了實現這兩個接口的唯一原因,我會創建一個公共基類,但是如果因爲其他原因已經有了一個公共基類,爲什麼不呢?

MyFramework.ITransaction可以從NHIbernate.ITransaction繼承,確保MyFramework.ITransaction的所有實現者在NHibernate.ITransaction也是實現者。

最後,您可以使用ITransactionWraper和2個實現器(MyFrameworkTransactionWrapper和NHibernateTransactionWrapper)實現Adapter模式。您的所有代碼都將寫入ITransactionWrapper接口,其實現者將調用委託給正確的ITransaction。與大多數適配器模式實現一樣,您可能會使用Factory或AbstractFactory模式在運行時創建正確的包裝器,如配置所指示的那樣。

+0

由於NHibernate.ITransaction具有數據庫特定的方法,因此MyFramework.ITransaction不能具有與NHibernate.ITransaction相同的接口。你將如何實現接口的適配器模式? – 2010-07-27 22:39:22

+0

我的答案包含適配器模式的基礎知識(請參閱ITransactionWrapper),但我會嘗試擴展一點:假定NHibernate.ITransaction定義了SaveToDB()函數,並且您的ITransaction接口定義了SaveToFile()。你希望你所有的代碼只需調用Save()。您的ITransactionWrapper將定義Save()。您的MyFrameworkWrapper將實現Save()作爲對其包裝對象SaveToFile()的調用。您的NHibernateWrapper將實現Save()作爲對其包裝對象SaveToDB()的調用。你的調用代碼永遠不需要知道哪個對象被包裝。它只是調用Save()。 – mikemanne 2010-07-28 13:04:35

+0

注意:我上面的對象命名非常快速和骯髒 - 您不想命名ITransactionWrapper接口,因爲「包裝器」描述了一個實現。 ITransactable或ISaveable將是更好的名字,但仍不完美。 – mikemanne 2010-07-28 13:05:59