我有一個支持兩個數據訪問層的應用程序:db4o和RavenDB。邏輯類使這樣的呼籲得到一個具體的數據類:用於初始化一個類(但不是另一個)的優雅解決方案
return DataAccessFactory.GetDataInterface<IApplicationData>().GetAll();
這裏是DataAccessFactory返回正確的ApplicationData(db4o的或RavenDB)具體類的方法:
public static T GetDataInterface<T>() where T : class
{
T theObject = // Code here to get the object. Not relevant to this question.
// Begin HACK
DataAccessLayerBase theObjectAsRavenDalBase = theObject as DataAccessLayerBase;
if (theObjectAsRavenDalBase != null)
{
theObjectAsRavenDalBase.SetAsInitialDalInstanceAndCreateSession();
}
// End HACK
return theObject as T;
}
的黑客工具,我已經實現了投射到RavenDB的DataAccessLayerBase版本,並且如果聲明。如果具體類碰巧是一個RavenDB類,那麼我需要調用一個方法。 (這裏顯示的DataAccessLayerBase位於RavenDb名稱空間中,db4o也是他自己的DataAccessLayerBase。)
解決此問題的一種方法是讓每個DataAccessLayerBase實現一個常用方法,如Initialize()。 db4o的Initialize()方法什麼都不做,而RavenDB的Initialize()方法將執行必要的邏輯。然後這個方法可以簡單地調用Initialize()而不關心它是哪個具體類。
有沒有比這更好的設計?我認爲我剛剛描述的修復程序足夠的體面,但我不禁想到我錯過了一些東西。我正在尋找更好,更優雅的方式來解決這個問題。我提議的方法的一個缺點是其他數據訪問層必須實現Initialize(),儘管我只需要RavenDB。
注意:當創建它們時,我不能只是讓具體類執行此初始化操作,因爲只有在調用DataAccessFactory.GetDataInterface> <>()時它纔會發生。
謝謝TGH。您的選項聽起來有點像當前的實現:檢查類型,並可選擇調用方法。我希望有一個更多樣的解決方案,而不用* if *檢查。 – 2012-03-31 01:42:54
是的,有很多相似之處。儘管可以避免演員陣容......但我認爲,您調用Initialize()的想法實際上是最好的基於多態的方法。對不起,我現在不能更有創意,但它似乎試圖用相同的方法處理具有不同需求的對象,因此需要對您在問題中描述的兩種解決方案進行一些變化。至少Initialize()的想法如果你還有其他幾種類型的話,會很有意義...所以即使你只有兩個類型,也許它仍然是合適的: - )... – TGH 2012-03-31 01:56:08
我開始這麼認爲。有一種稱爲空設計模式的設計模式。基本上,那些不需要做任何事情的數據類,就是不會做任何事情。這樣,他們都可以用同樣的方式來對待。由於該方法是應該調用該邏輯的地方,因此這是稱之爲的正確位置。感謝您幫助我解決這個問題。 – 2012-03-31 02:00:38