2013-03-29 83 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

相关问题