从app.config获取ConnectionString

时间:2013-03-29 07:33:00

标签: c# connection-string app-config

我有一个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>

在DataAccess项目中,我有BuildConnection方法:

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

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

3 个答案:

答案 0 :(得分:0)

在运行时,只有一个配置文件。所以活动项目的配置文件只是 考虑。另外,您不能将类库项目作为活动/启动项目,即

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

现在你能做什么?

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

    <强>的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>
    

    <强> YourSettings.config:

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

    详细了解here

  2. 如果您想为您的活动项目本身提供单独的配置文件,那么完全不同于完全不同的故事。 这是一种丑陋的调整,但请阅读here

答案 1 :(得分:0)

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

但是把东西放到正确位置的方法是正确的,问题是当你引用一个dll时它不包括dll项目的配置。

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

答案 2 :(得分:0)

是的,这是可能的。

你的app.config:

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

您的DataAccess图层:

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);
        }
    }
}

编译数据访问项目时,它会从MyApp.DataAccess.dll.config内容中生成app.config。将MyApp.DataAccess.dll.configMyApp.DataAccess.dll添加到您的网络应用项目中,并确保将Copy To Output Directory标记为Copy if newer MyApp.DataAccess.dll.config