2013-03-29 69 views
0

我有一個Web項目調用一個庫項目(DataAccess)從數據庫中檢索一些數據。我添加了一個App.config文件(添加 - >新建項目 - >應用程序配置文件)的數據訪問項目,並增加了部分的connectionString像這樣:從app.config獲取ConnectionString

<configuration> 
    <connectionStrings> 
    <add name="local" 
     connectionString="Data Source=.\sql2008;Initial Catalog=myDB;Integrated Security=True" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

在數據訪問項目,我有BuildConnection方法:

internal static SqlConnection BuildConnection() 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings["local"].ToString(); 
    return new SqlConnection(connectionString); 
} 

當我從Web項目調用方法時,它會拋出一個空異常,抱怨「本地」連接字符串不存在。在調試了一段時間後,我將相同的連接字符串添加到Web項目的Web.config中,現在它工作正常。但問題是我想將DataAccess項目從Web項目中分離出來,換句話說,無論是誰調用它,我都希望DataAccess項目使用它自己的app.config文件來。這甚至有可能嗎?任何幫助,將不勝感激。

+0

假設您有MyApp.DataAccess.dll,MyApp.DataAccess.dll.config和MyApp.WebApp.dll,當您從您的Web應用程序訪問您的數據訪問時,您可以讓數據訪問從其中讀取連接字符串自己的配置文件。這是可能的。你需要'ConfigurationManager.OpenExeConfiguration'。 –

回答

0

在運行時,只有一個配置文件。所以活動項目的配置文件僅爲 。另外,您不能將類庫項目作爲活動/啓動項目,例如

說您的解決方案中有4個項目,並且每個項目都有一個配置文件,那麼當您運行應用程序時,只有活動項目的這是你的啓動項目)配置文件被識別。

現在你可以做什麼?

  1. ,如果你只是想在配置文件的部分隔離開來,那麼你可以在每個項目,這反過來,在主項目的配置即

    網站引用的配置文件的.config:

    <?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
        <appSettings file="YourSettings.config"> 
         <add key="KeyToOverride" value="Original" /> 
         <add key="KeyToNotOverride" value="Standard" /> 
        </appSettings> 
        <system.web> 
         <!-- standard web settings go here --> 
        </system.web> 
    

    YourSettings.config:

    <appSettings> 
        <add key="KeyToOverride" value="Overridden" /> 
        <add key="KeyToBeAdded" value="EntirelyNew" /> 
    </appSettings> 
    

    閱讀更多關於它here

  2. ,如果你想擁有單獨的配置文件爲您激活項目本身,比整個是完全不同的故事

    。 同類醜陋的調整,但讀到它here

0

,當你在一個應用程序中使用的app.config使用。對於使用應用程序配置文件的圖書館項目沒有幫助。即使你把它的參考庫的代碼放在web服務器上。 所以這種類型的隔離對於任何安全問題都沒有意義。

但是把東西放在正確的地方的方法你是對的,問題是當你引用一個dll時,它不包含dll項目的配置。

如果你想要更多:)只是閱讀應用程序。配置在你的lib項目中,並使用代碼生成器創建一個連接字符串對象,如公共靜態字符串ConnectionString = $ GeneratedCode $;

0

是的,這是可能的。

你的app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="foo" value="bar"/> 
    </appSettings> 
</configuration> 

你的數據訪問層:

namespace MyApp.DataAccess 
{ 
    public class DB 
    { 
     public string cfg; 
     public DB() 
     { 
      var asmName = System.Reflection.Assembly.GetAssembly(this.GetType()).GetName().Name; 
      var asmPath = System.Web.HttpContext.Current.Server.MapPath(@"bin\" + asmName + ".dll"); 
      var cm = ConfigurationManager.OpenExeConfiguration(asmPath); 
      this.cfg = cm.AppSettings.Settings["foo"].Value; 
     } 
    } 
} 

下面是如何使用它:

namespace MyApp.WebApp 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      var db = new MyApp.DataAccess.DB(); 
      Response.Write(db.cfg); 
     } 
    } 
} 

當編譯數據訪問項目,它會從您的app.config內容中生成MyApp.DataAccess.dll.config。將MyApp.DataAccess.dll.configMyApp.DataAccess.dll添加到您的網絡應用程序項目中,並確保將Copy To Output Directory設置爲Copy if newerMyApp.DataAccess.dll.config

相關問題