連接字符串在.NET / LINQ-SQL / ASP.NET中的地獄


5 Answers

啟動項目的配置文件將定義所有包含項目的配置設置。 例如,如果您的Web項目是啟動項目,則任何對“appSettings”的引用都將從web.config中查找設置,其中包括對數據訪問項目中“appSettings”的引用。 因此,將Data Access項目的app.config中的任何配置設置複製到Web項目的web.config。

Question

我有一個Web應用程序,包括以下內容:

  • 一個web項目(帶有一個web.config文件,包含一個連接字符串 - 但在web項目中沒有數據訪問代碼)
  • 一個使用LINQ-SQL類為Web項目UI提供實體的數據訪問項目(該項目有一個設置文件和一個app.config - 兩者都有連接字符串)

在構建和部署時,Bin目錄中沒有設置文件或app.config,但是數據訪問.dll不變,但是在web.config文件中更改連接字符串並不會相應地更改數據庫 - 所以連接字符串必須被編譯成數據訪問DLL。

我需要的是我的整個部署的一個配置文件 - 網站,數據訪問DLL,一切 - 有一個連接字符串被使用。 目前似乎有多個連接字符串正在使用或硬編碼到處都是。

我該如何最好地解決這個混亂?

謝謝你的幫助。




基於.config文件滾動您自己的ConnectionFactory:

  • 定義一個自定義配置部分來映射鍵/連接字符串對
  • 教您的ConnectionFactory適當地使用主機名或機器名嗅探到該配置部分
  • 為各種dev / qa / prod服務器填充鍵/連接字符串值,並將其放入各種app.config,web.config等文件中。

優點:

  • 所有生活在項目內部,所以沒有驚喜
  • 添加額外的部署目標是.config文件中的複制/粘貼操作

缺點:

  • 使大醜醜的部分,特別是如果你有一打生產服務器
  • 需要在項目之間重複
  • 需要更改代碼並重新部署以添加新的目標
  • 代碼需要知道它所處的環境



當需要使用數據訪問項目時,您也可以讓Web應用程序提供連接字符串。 你可以使它成為構造函數的一部分。

另外,當數據訪問項目進行調用時,您可以編寫自己的邏輯來從外部文件加載連接字符串。




感謝您的回應。

那些說應用程序將使用web.config中的設置對於我在自己的代碼中引用它的實例是正確的:

_connectionString = ConfigurationManager.AppSettings["ConnectionString"];

..但是LINQ-SQL datacontexts有一個不同的問題 - 我認為它們包含編譯後的dll中的連接字符串,以便在無參數的構造函數中使用。 正如tvanofosson所說,我需要通過在web.config中傳入連接字符串的引用來創建datacontexts。 這是我陷入困境的地方:)




您的應用程序將只使用web.config文件中的配置項。 只要結構正確,您可以將dll配置設置放在web.config文件中。 我的例子是VB具體使用我的命名空間,但它給你的一般想法。

在配置文件的configSections paret中,您將需要一個條目:

<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="YourAssembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup></configSections>

然後在配置文件的applicationSettings部分中,為每個dll添加條目:

    <applicationSettings>
      <YourAssembly.My.MySettings>
        <setting name="DebugMode" serializeAs="String">
            <value>False</value>
        </setting>
      </YourAssembly.My.MySettings>
    </applicationSettings>  



這裡有一個方法來看看它。 哪個組件應該決定使用哪個數據庫? 數據庫(或至少是連接字符串)可能會在將來發生變化。 網站是否決定使用哪個數據庫? 或者,DAL是否決定?

如果你有dev,QA,UAT和prod數據庫,管理這些連接字符串是至關重要的。

如果網站決定,它應該將連接字符串從它的web.config傳遞給DAL。 如果網站不應該知道或關心數據來自何處,則連接字符串屬於DAL。




Related