2008-11-20 58 views
4

在我們的Web應用程序中,我們將數據訪問層分離到他們自己的項目中。替代使用web.config存儲設置(適用於複雜的解決方案)

這會產生一些與設置有關的問題。

因爲DAL最終需要從多個應用程序中消費,所以web.config似乎不是一個保存連接字符串和其他DAL相關設置的好地方。

爲了解決這個問題,在我們最近的一些項目中,我們引入了第三個項目,僅用於設置。我們把設置放在一個.Setting文件系統中......通過一個簡單的包裝,可以輕鬆實現各種環境(Dev,QA,Staging,Production等)的不同設置。

唯一的問題是設置項目(包括.Settings類)編譯成一個程序集,所以如果不進行構建/部署就不能更改它,而且我們的一些客戶希望能夠配置他們的項目沒有Visual Studio。

那麼,有沒有最佳做法呢?我有這種感覺,我正在重塑車輪。

我們發現了一些解決方案,比如將設置存儲在服務器上的固定目錄中,比如我們自己的XML格式。但是,我寧願避免爲敏感值重新創建加密等等。如果可能,我寧願保持解決方案自包含。

編輯:原來的問題並沒有包含我們無法(我認爲)使用web.config的真正深入的原因......這使得我的不好的一些(非常好的)回答脫離了上下文。

回答

1

拆分它。使用固定的XML存儲文件解決方案進行數據庫連接,並使用.NET內置的加密函數進行加密(不要自行加載)。然後,使用生成的數據庫連接,查找數據庫中的「設置表」。這樣您就可以在不進行重新部署的情況下修改設置。如果客戶需要能夠在不使用Visual Studio的情況下更改數據庫連接字符串,只需編寫一個小型Windows窗體應用程序,該應用程序能夠生成加密的連接字符串並保存固定的XML存儲文件,並且必要時還可以連接到DB(通過相同的文件)並根據用戶需要修改設置表。

+0

我一直這樣做了一段時間,這很好。在Web.Config中,我只存儲了一個連接字符串和一個名爲'enviroment'的變量,其中包含一個值,如Production,Staging,Development。然後在數據庫中有一個名爲Settings的表格,其中包含所有不同環境的所有設置。我使用RedGate的SQL數據比較來保持全部同步。 – 2009-11-30 16:25:36

3

System.Configuration.ConfigurationManager.ConnectionStrings和System.Configuration.ConfigurationManager.AppSettings 包含來自執行的應用程序設置,以便在你的DAL你可以得到存儲在你的web.config文件中的設置。

對於您的系統,您可以創建一個自定義配置節,該節將位於您的web.config文件或DAL的consumer * .config文件中在這些配置文件中,您可以指定它們從您設計的單獨配置文件加載,位置。 Referencing external config files from Web.Config How to: Create Custom Configuration Sections Using ConfigurationSection

Alternativly您可以manualy使用ConfigurationManager.OpenExeConfiguration

0

你可以有一個映射,你是在你的DAL使用設置的界面的任何文件加載DAL配置數據。然後在應用程序中,您可以使用IoC將設置提供給DAL。

2

您可以將等價物添加到名爲app.config的web.config文件中,該文件將編譯到爲您的代碼的dll或exe項目命名的文件中。這是完全可以改變的,無需重新編譯。您可以使用連接字符串的標準設置以及可以在鍵/值對中定義的各種應用設置 - 也可以使用更多的工作來定義自己的自定義配置設置類和部分。你甚至可以在應用配置中引用設置 - 這樣你可以在應用中存儲3個設置(DEV,QA,PROD),然後只在你的app.config文件中引用你想要的運行時設置。以下是爲網絡服務設置創建的示例。

<?xml version = " 1。0 " encoding = " utf-8 "? >
<配置>
    <configSections>
        < sectionGroup名稱= "的applicationSettings "類型= " System.Configuration.ApplicationSettingsGroup,系統,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089 " >
            <段名= " {項目} .Properties.Settings "類型= " System.Configuration.ClientSettingsSection,系統,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089 " requirePermission = "假"/>
        </sectionGroup >
        <段名= " microsoft.web.services3 "類型= " Microsoft.Web.Services3.Configuration.WebServicesConfiguration,Microsoft.Web.Services3,版本= 3.0.0.0,文化=中性公鑰= 31bf3856ad364e35 "/>
    </configSections >
    <的applicationSettings >
        < {項目} .Properties.Settings >
            <設置名= " {SettingName} " serializeAs = "字符串" >
                <值> {SettingValue} < /值>
            < /設置>
        < /{Project}.Properties.Settings >
    < /的applicationSettings >
    < microsoft.web。服務3 >
        <安全>
            <securityTokenManager>
                <增加類別= " Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,微軟.Web.Services3,Ver sion = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 " namespace = " http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot;的localName = "的UsernameToken "/>
            </securityTokenManager >
        < /安全>
    </microsoft.web.services3>
< /配置>

1

完全不同的方法是使用SQLite並將所有應用程序設置存儲在那裏。你可以用密碼保護有問題的數據庫,如果這對於應用程序很重要,你可以創建一些簡單的屬性/值表來存儲數據。

使用SQLite ADO adapter只需要1個額外的DLL到項目中來訪問設置,並且SQLite數據庫本身可以被那些不想使用Visual Studio的人訪問。甚至還有一個Firefox插件可以與SQLite數據庫進行交互。

0

如果您使用DI框架(如Unity),則可以指定構造函數參數。因此,假設您的DAL提供程序可以有一個構造函數來接收連接字符串。

我知道你不能在接口中執行構造函數,但這是我們必須處理的。我知道這個框架有幾個地方有構造函數簽名的潛在依賴...

2

聽起來像你不明白web.config/app.config是如何工作的,如果我正確地閱讀你的話。比方說,你有一個像下面這樣的結構:

DAL項目

參考文獻:

  • 一些核心庫
  • 其他引用

類:

  • DatabaseHelper
  • ObjectClass1
  • ObjectClass2
  • 等...

Web項目

參考文獻:

  • 一些核心庫
  • DAL項目
  • 其他引用

頁:

  • Default.aspx的
  • SomePage1.aspx
  • 等...
  • 網絡。配置

在你DatabaseHelper類,則可能會引用連接字符串,像這樣:

string connString = ConfigurationManager 
    .ConnectionStrings["myConnString"] 
    .ConnectionString; 

當這種情況發生在運行時,你DatabaseHelper類將相同的應用程序域爲網頁下運行,因此,到ConfigurationManager中的任何調用將負載從Web項目中提供的web.config文件中的要求。

因此,您只需要一個配置文件在網絡/主機/的WinForms /等等項目,而不必擔心您的每一個類庫項目具有在設計時一個。

如果實際運行您的DAL作爲一種服務或一​​個單獨的控制檯應用程序或東西,那麼只有到那時,你會需要給DAL項目它自己的app.config/web.config文件。

+0

這裏缺失的部分在我的編輯中。 DAL需要可以從不同的應用程序域使用,也就是說它最終也會在我們正在構建的初始網站之外的其他地方使用。 – 2008-11-20 20:17:56

1

您可以將設置存儲在任何舊的Xml文件中,並使用XmlSerializer將您的類拿到並將其轉換爲來自Xml的< - >。在另一個answer我寫了一些代碼,就是這樣做的。鏈接的答案簡單的序列化對象的列表,但它也適用於連載一個大的配置對象。

由於XmlSerializer序列化到/來自公共屬性,如果您不想允許值更改,您可能需要使該類本身不可變(冰棍風格),或者擁有位於前面的只讀外觀反序列化的。

這是一個方便的技巧。您可以通過ConfigurationManager.AppSettings []使用它自己的配置節和外部文件引用進行設置,或者您可以對每個配置類硬編碼一個特定的xml文件名。

相關問題