2012-12-13 58 views
3

在標準的3層應用程序(Winforms Ui,BLL,DAL)中,我需要針對每個層設置特定的設置。3層應用程序中的配置設置放置

我應該使用Winforms應用程序設置來包含所有這些設置嗎?或者我應該讓每個dll(BLL,DAL)都帶有它們的設置?

我需要一個簡單的解決方案,而不是在數據庫或自定義xml中,我也需要爲同一個體系結構提供多個UI。

更新:目前我傾向於單獨的.config文件中每一層,我只是不知道這是否是,將允許大部分的未來變化的最佳實踐(在層和/或多個UI應用程序的變化) 。

結果:我想我會在每個需要設置的項目中都有一個靜態單例類。我會用最合適的方式每次用上層填充它們。

回答

2
  1. 自定義xml文件是靈活的方法,但需要一點努力。

  2. 使用單獨的庫項目僅用於設置,其更簡單的方法,因爲您可以使用默認設置類來保存/加載設置,但對於嵌套設置不太靈活。

  3. 將與DAL的所有設置,因爲它住在根和所有其他項目(UI,BAL)引用它)

+0

把我的用戶界面設置放在DAL中會感覺很奇怪,因爲我會有很多不同的UI。目前我正在爲每個圖層分別創建一個.config文件,我不知道這是否是最佳做法 – e4rthdog

+2

您可能會保留具體設置的範圍是特定的項目,但是有很多事情需要在不同的項目/層之間共享,因此設置應該獨立於項目。一個單獨的xml文件或一個帶有讀/寫/加載設置的庫項目。單獨設置類的單獨程序集是很好的選擇。 – Munawar

+0

所以我可以爲每個項目設置一個靜態單例類。通過這種方式,我可以使用盡可能多的方式填充上層的數據。正確? – e4rthdog

1

如果你所有的層在同一AppDomain中運行(而不是說,在WCF服務中託管BLL/DAL),那麼KISS解決方案將在客戶端的app.config文件中包含所有配置信息。

您可以使用命名約定來區分屬於每個圖層的設置。

UPDATE

從評論:

目前是的,但我想可以自由地(通過WCF例如)稍後更改甚至DAL演示。

這很簡單:當您將邏輯層移動到不同的物理層(如WCF)時,將其配置移動到主機的配置文件中(例如,如果主機是IIS,則爲web.config)。

+0

當然是的,但我想要自由以後甚至可以更改DAL演示文稿(例如通過WCF)。如果我在每個圖層上創建一個配置類並讓自己獨立於此類將被填充的位置,該怎麼辦? – e4rthdog

1

每次我嘗試使用內置的app.config文件時,由於內置解決方案的缺陷,我最終實現了自己的配置解決方案。實現基於xml的自定義解決方案並不複雜。這其實很簡單。

只是把這個基類到您的解決方案:

[Serializable] 
public abstract class ConfigBase<DerivedT> where DerivedT : ConfigBase<DerivedT> 
{ 
    protected string FilePath; 
    public string FileVersion; 

    public ConfigBase() { } 

    public void Save() 
    { 
     XmlSerializer xs = new XmlSerializer(GetType()); 
     using (StreamWriter writer = File.CreateText(FilePath)) 
     { 
      xs.Serialize(writer, this); 
     } 
    } 

    public static DerivedT Load(string filename) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(DerivedT)); 
     using (StreamReader reader = File.OpenText(filename)) 
     { 
      DerivedT config = (DerivedT)xs.Deserialize(reader); 
      config.FilePath = filename; 
      return config; 
     } 
    } 
} 

然後你就可以做出這樣的配置文件:

public class Config : ConfigBase<Config> 
{ 
    // put your variables here like below 
    public string DatabaseConnectionString; 
    public int numberOfConnections; 
} 

使用方法如下:

// Load it like this 
Config config = Config.Load(ConfigFileName); 
// Save it like this 
config.Save(); 

感覺可以在配置文件中自由使用屬性,數組和其他複雜結構。它將全部自動序列化。如果您不希望某些字段/屬性序列化,請使用XmlIgnore屬性。有了這個解決方案,你可以有許多不同的配置文件,但有一個機制來加載和保存它們。

我經常在配置文件中包含一個公共的靜態Config GenerateDefault(字符串ConfigFileName)工廠方法,它將產生一個帶默認值的示例配置。

不要忘記檢查文件文件是否存在並將其加載到try/catch塊中。

更好的解決方案是使用DataContracts,它允許您序列化私有成員並提供支持不同版本的DataContracts的良好機制,但它稍微複雜一些。

+0

我不想弄亂自定義配置文件,因爲我保持我的設置相當簡單。我需要找到一種使用標準功能和抽象概念的方法 – e4rthdog