2008-08-15 115 views
2

我目前正在使用的數據庫應用程序存儲數據庫中的各種設置。大部分這些設置都是爲了自定義某些業務規則,但其中還有其他一些內容。訪問全局應用程序設置

該應用程序包含特定執行特定任務的對象,例如某些複雜的計算。這些非UI對象經過了單元測試,但也需要訪問許多全局設置。我們現在已經實現了這一點,就是通過給出運行時由應用程序控制器填充的對象屬性。測試時,我們在測試中創建對象並填寫測試值(而不是數據庫)。

這工作得更好,在任何情況下,不是讓所有這些對象需要一些全球設置對象更好---這當然是有效地使單元測試是不可能的:)缺點可能是你有時需要設置一打屬性,或者你需要讓這些屬性滲透到子對象中。

所以一般的問題是:你如何在你的項目中提供對全局應用程序設置的訪問,而不需要全局變量,同時仍然能夠對你的代碼進行單元測試?這一定是一個已經解決了100多年的問題......

(注意:我不是一個有經驗的程序員,因爲你會注意到;但我喜歡學習!已經完成了對這個主題的研究,但我真的在尋找一些第一手經驗)

回答

1

您可以使用Martin Fowlers ServiceLocator模式。在PHP它可能看起來像這樣:

class ServiceLocator { 
    private static $soleInstance; 
    private $globalSettings; 

    public static function load($locator) { 
    self::$soleInstance = $locator; 
    } 

    public static function globalSettings() { 
    if (!isset(self::$soleInstance->globalSettings)) { 
     self::$soleInstance->setGlobalSettings(new GlobalSettings()); 
    } 
    return self::$soleInstance->globalSettings; 
    } 
} 

生產代碼然後初始化像這樣的服務定位:

ServiceLocator::load(new ServiceLocator()); 

在您的測試代碼,您插入模擬設置是這樣的:

ServiceLocator s = new ServiceLocator(); 
s->setGlobalSettings(new MockGlobalSettings()); 
ServiceLocator::load(s); 

這是一個可以交換用於測試目的的單身存儲庫。

0

通常這是由ini文件或XML配置文件處理的。然後,你只需要有一個班級在需要時讀取設置。

.NET有內置的ConfigurationManager類,但它很容易實現,只需讀取文本文件,或將XML加載到DOM中或手動解析它們在代碼中。

在數據庫中有配置文件是好的,但它確實將您綁定到數據庫,併爲ini/xml文件解決的應用程序創建額外的依賴關係。

0

我這樣做:

public class MySettings 
{ 
    public static double Setting1 
     { get { return SettingsCache.Instance.GetDouble("Setting1"); } } 

    public static string Setting2 
     { get { return SettingsCache.Instance.GetString("Setting2"); } } 
} 

我把這個單獨的基礎設施模塊中刪除與循環依賴任何問題。
這樣做我沒有綁定到任何特定的配置方法,也沒有任何字符串在我的應用程序代碼中運行混亂。

1

我喜歡將我的配置訪問建模爲服務定位器模式。這給了我一個單獨的觀點來獲取我需要的任何配置值,並將它放在應用程序之外的獨立庫中,它允許重用和可測試性。以下是一些示例代碼,我不確定您使用的是什麼語言,但我使用C#編寫了它。

首先我創建一個泛型類來模擬我的ConfigurationItem。

public class ConfigurationItem<T> 
{ 
    private T item; 

    public ConfigurationItem(T item) 
    { 
     this.item = item; 
    } 

    public T GetValue() 
    { 
     return item; 
    } 
} 

然後,我創建一個類,爲配置項目公開靜態只讀變量。這裏我只是從配置文件中讀取ConnectionStringSettings,它只是xml。當然對於更多的項目,您可以閱讀任何來源的值。

public class ConfigurationItems 
{ 
    public static ConfigurationItem<ConnectionStringSettings> ConnectionSettings = new ConfigurationItem<ConnectionStringSettings>(RetrieveConnectionString()); 

    private static ConnectionStringSettings RetrieveConnectionString() 
    { 
     // In .Net, we store our connection string in the application/web config file. 
     // We can access those values through the ConfigurationManager class. 
     return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ConnectionKey"]]; 
    } 
} 

後來,當我需要使用的形態項目,我這樣稱呼它:

ConfigurationItems.ConnectionSettings.GetValue(); 

,它將返回我一個類型安全的值,然後我就可以緩存或做任何我想。

這裏有一個樣本測試:

[TestFixture] 
public class ConfigurationItemsTest 
{ 
    [Test] 
    public void ShouldBeAbleToAccessConnectionStringSettings() 
    { 
     ConnectionStringSettings item = ConfigurationItems.ConnectionSettings.GetValue(); 
     Assert.IsNotNull(item); 
    } 
} 

希望這有助於。

相關問題