2016-07-07 81 views
0

我在C#中遇到了一個問題,當我想對數據庫執行查詢時,我創建了一個新的DBQuerier()實例並調用其上的Run()方法。在沒有參考的情況下保留數據

DBQuerier可以連接到幾個數據庫中的一個,具體取決於傳遞給運行方法的內容 - 例如新的DBQuerier().Run(DBEnum.CatDatabase);

DBQuerier是圖書館的一部分,因爲各種解決方案都使用它。

我有一個配置文件,我可以加載和解析,以獲得加載到內存中的所有連接,用於枚舉查找。但是,我不確定如何堅持這些信息。它看起來像依賴注入工作:

new DBQuerier(new MyConnectionStringLoader()).Run(...)

不過,我不希望它加載的文件,並解析數據庫查詢以這種方式運行的每一次它。我無法將它存儲在DBQuerier中,因爲每次都創建並丟棄該對象。

如果我創建一個ConnectionStringManager類,如果它是靜態的,那麼我不能幹淨地依賴注入MyConnectionStringLoader到它,並且它使得單元測試更難。如果我把它做成單身人士,我有一些類似的問題。

是否有解決此問題的好方法?谷歌搜索顯示無數帖子說'永遠不會使用靜態類或單身人士',所以我很困難。

+0

永不言不絕!在這種情況下,我會說singleton和static是友好的。但是爲什麼你不用DBQuerier創建一個包含你需要的額外信息的類,比如ConnectionString? – Mono

回答

0

在你的情況下,一個singleton(支持DI)是一條有效的路線。

+0

谷歌搜索模式爲此揭示了很多站點說單身人士和DI壞...但我認爲你是對的,我不得不忽視他們! – NibblyPig

+1

@SLC觀點就像人體的某個特定的區域*每個人都有一個。只要界面有意義,它是有據可查的,並且具有與系統其餘部分類似的操作啓發式模式,它應該被使用。 – OmegaMan

2

看來DbQuerier對於任何數據庫都完全一樣。唯一改變的是連接字符串。

我會做這樣的事情:

public interface IDbQuerier 
{ 
    void Run(); 
} 

public abstract class BaseDbQuerier : IDbQuerier 
{ 
    private static IDictionary<DbEnum, string> _connections; 

    static BaseDbQuerier() 
    { 
     _connections = // Load connection strings from configuration 
    } 

    protected abstract DbEnum Database { get; } 

    public void Run() 
    { 
     string connectionString = _connections[Database]; 
     // DbQuerier logic 
    } 
} 

public enum DbEnum 
{ 
    CatDatabase, 
    DogDatabase, 
    TurtleDatabase 
} 

然後在不同的實現:

public class CatDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.CatDatabase; } } 
} 

public class DogDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.DogDatabase; } } 
} 

public class TurtleDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.TurtleDatabase; } } 
} 

擁有的每個數據庫都會讓你輕鬆地將它注入到需要它的任何類不同的實現,使用您選擇的DI框架。

+0

這看起來不錯,我會嘗試這種方法。非常感謝。 – NibblyPig

相關問題