2012-03-31 18 views
1

我有一個支持兩個數據訪問層的應用程序: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> <>()時它纔會發生。

回答

0

另一個解決方案是在您的DataAccess類實現的接口上添加一個type屬性。然後您可以檢查該類型以知道是否需要調用SetAsInitialDalInstanceAndCreateSession方法。我認爲上面描述的Initialize方法也是一個很好的解決方案,儘管

+0

謝謝TGH。您的選項聽起來有點像當前的實現:檢查類型,並可選擇調用方法。我希望有一個更多樣的解決方案,而不用* if *檢查。 – 2012-03-31 01:42:54

+0

是的,有很多相似之處。儘管可以避免演員陣容......但我認爲,您調用Initialize()的想法實際上是最好的基於多態的方法。對不起,我現在不能更有創意,但它似乎試圖用相同的方法處理具有不同需求的對象,因此需要對您在問題中描述的兩種解決方案進行一些變化。至少Initialize()的想法如果你還有其他幾種類型的話,會很有意義...所以即使你只有兩個類型,也許它仍然是合適的: - )... – TGH 2012-03-31 01:56:08

+0

我開始這麼認爲。有一種稱爲空設計模式的設計模式。基本上,那些不需要做任何事情的數據類,就是不會做任何事情。這樣,他們都可以用同樣的方式來對待。由於該方法是應該調用該邏輯的地方,因此這是稱之爲的正確位置。感謝您幫助我解決這個問題。 – 2012-03-31 02:00:38

相關問題