2011-08-03 38 views
0

我有以下的接口和類:如何配置對象,並重寫配置

public interface ILoggingService { ... } 
public class LoggingService { 
    public LoggingService(ILoggingRepository loggingRepository) { ... } 
    ... 
} 

public interface ILoggingRepository { ... } 
public class DatabaseLoggingRepository { 
    public DatabaseLoggingRepository(string ConnectionString) { ... } 
    ... 
} 
public class FileLoggingRepository { 
    public FileLoggingRepository(string LogFilePath) { ... } 
    ... 
} 

我重構我的軟件使用統一的IoC框架,並正在尋找一種方式來傳遞特定的配置每個ILoggingRepository實現。

我認爲最好的方法是將DatabaseLoggingRepository和FileLoggingRepository的構造函數改爲根本沒有參數,並讓它們通過某個配置文件進行配置。但是,由於我的驗收測試,我需要一種簡單的方法來在運行測試時覆蓋這些設置。

我在正確的軌道上,如果我在,我應該使用哪些配置文件?其他方式也是受歡迎的。

+0

我的第一個想法是:a。調試和發佈版本有一個單獨的配置文件。灣使用預處理器指令來決定使用哪個配置:'#if DEBUG''//使用調試配置.'#else''//使用官方配置'#endif' –

+0

這是**甚至沒有關閉**適當的IoC解決方案。如果沒有別的,我希望我的單元測試能夠成功,無論它們是在Debug還是Release配置中運行。 –

+0

不幸的是我需要在同一個測試夾具的運行過程中有這兩個不同的設置。第一個測試使用正確的ConnectionString測試行爲,下一個測試使用錯誤的ConnectionString運行。 –

回答

2

我們決定要做的是創建一個類,在你的情況下它將是LoggingConfiguration,並將其傳遞給存儲庫的構造。如果你解決使用Unity,它將使用Activator實例化這個類,wuthout必須註冊它。然而,在您的測試中,您只需創建派生配置類的新實例,並提供不同的值。

它有道理嗎?我應該澄清更多?

更新:我決定提供一些額外的說明。所以,你已經有了兩個實現,現在你想讓每個配置查詢它的正確配置設置。

我將擴展ILoggingRepository的構造看起來像這樣:

public ILoggingRepository(ILoggingConfigurationProvider confProvider); 

然後,您可以創建一個實現你的正常工作,其具有兩個屬性:

public LoggingConfigurationProvider : ILoggingConfigurationProvider { 
public LoggingConfigurationProvider() { 
    // load both values from configuration file 
} 

public string LogPath { get; set; } 
public string ConnectionString { get; set; } 
} 

當你實例化你類通過正常的IoC操作,這將通過容器解決,你將從配置文件中加載配置選項。當您然而想要做單元測試你:

new LoggingRepository(new MockLoggingConfigurationProvider()); 

,或者:

1)創建一個新的「模擬」實施

public class MockLoggingConfigurationProvider : ILoggingConfigurationProvider { 
    public MockLoggingConfigurationProvider() { 
     // set both values to a test value 
    } 

    public string LogPath { get; set; } 
    public string ConnectionString { get; set; } 
} 

現在,您可以使用一個構造函數創建存儲庫您希望使用整個IoC機制,您只需(在設置容器時)註冊接口的此實現。由於單元測試是分開的,因此您不會分享註冊權限嗎?所以這應該給你你需要的東西,根據它們作爲一個單元測試執行的天氣來改變這個設置的能力。

在現實生活中,我甚至不會爲此煩惱,只需創建一個模擬日誌記錄庫並將其寫入其他位置。除非你想測試版本庫到測試數據庫/文件。在這種情況下,我會按照規定去做。

希望它有幫助。

+0

如果你能騰出時間,更詳細的描述會很好。 –

+0

將更新答案。 –

0

作爲設計建議不強制IoC處理配置東西。每個記錄器應該按照他們的實施方式來管理配置。 IoC應該注入記錄器。對於單元/集成測試,在這兩種情況下,您應該能夠爲記錄器提供配置,例如使用log4net我習慣於在api的測試啓動中配置日誌子系統,然後創建appender那只是在控制檯上寫的東西。您不能通過IoC進行Insolate配置,因爲每個可能的日誌記錄系統都不需要爲配置部分共享合同。