C# 从app.config获取连接字符串

C# 从app.config获取连接字符串,c#,connection-string,app-config,C#,Connection String,App Config,我有一个Web项目,它调用一个库项目(DataAccess)从数据库中检索一些数据。我向DataAccess项目添加了一个App.config文件(Add->New Item->Application Configuration file),并添加了一个connectionString部分,如下所示: <configuration> <connectionStrings> <add name="local" connectionStrin

我有一个Web项目,它调用一个库项目(DataAccess)从数据库中检索一些数据。我向DataAccess项目添加了一个App.config文件(Add->New Item->Application Configuration file),并添加了一个connectionString部分,如下所示:

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

当我从Web项目调用该方法时,它抛出一个null异常,抱怨“本地”连接字符串不存在。调试了一段时间后,我将相同的连接字符串添加到Web项目的Web.config中,现在可以正常工作了。但问题是,我想将DataAccess项目与Web项目隔离开来,换句话说,我希望DataAccess项目使用自己的app.config文件,不管谁调用它。这可能吗?任何帮助都将不胜感激。

在运行时,只有一个配置文件。因此,活动项目的配置文件仅为 考虑过的。此外,不能将类库项目作为活动/启动项目,即

假设您的解决方案中有4个项目,每个项目都有一个配置文件,那么当您运行应用程序时,只会识别活动项目(即启动项目)的配置文件

现在你能做什么

  • 如果您只想隔离配置文件的各个部分,那么您可以在每个项目中使用配置文件,而这些配置文件又会在主项目配置中引用,即

    Web.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>
    
    <appSettings>
       <add key="KeyToOverride" value="Overridden" />
      <add key="KeyToBeAdded" value="EntirelyNew" />
    </appSettings>
    
    
    

  • 如果您想为活动项目本身拥有单独的配置文件,那就完全不同了。 这是一种丑陋的调整,但请阅读


  • 在应用程序中使用时,将使用app.config。对于使用应用程序配置文件的库项目没有帮助。即使您把它放在参考库中,代码也会放在web服务器中。 因此,这种类型的隔离对任何安全问题都没有意义

    但是把事情放在正确的地方的方法是正确的,问题是当你引用一个dll时,它不包括dll项目的配置

    如果您想要更多:)只需阅读lib项目中的app.config,并使用代码生成器创建一个连接字符串对象,如publicstaticstringconnectionstring=$GeneratedCode$

    是的,这是可能的

    您的app.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="foo" value="bar"/>
      </appSettings>
    </configuration>
    
    以下是如何使用它:

    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.config
    MyApp.DataAccess.dll
    添加到您的web应用程序项目中,并确保为
    MyApp.DataAccess.dll.config
    标记
    Copy to Output Directory
    以复制较新的
    ,当您从web应用访问数据访问权限时,您可以拥有从其自己的配置文件读取连接字符串的数据访问权限。这是可能的。您需要
    ConfigurationManager.OpenExeConfiguration
    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);
            }
        }
    }