0

我有一个 Web 项目,它调用一个库项目 (DataAccess) 从数据库中检索一些数据。我在 DataAccess 项目中添加了一个 App.config 文件(添加 -> 新项目 -> 应用程序配置文件),并添加了一个如下所示的 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 文件,无论谁调用它。这甚至可能吗?任何帮助,将不胜感激。

4

3 回答 3

0

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

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

现在你能做什么?

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

    网络配置:

    <?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>
    

    你的设置.config:

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

    在此处阅读更多信息

  2. 如果您想为您的活动项目本身提供单独的配置文件,那么这完全是另外一回事。这是一种丑陋的调整,但在这里阅读

于 2013-03-29T07:45:57.233 回答
0

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

但是将东西放在正确的位置的方法是正确的,问题是当您引用 dll 时,它不包含 dll 项目的配置。

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

于 2013-03-29T07:47:22.563 回答
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);
        }
    }
}

当您编译数据访问项目时,它会MyApp.DataAccess.dll.config从您的app.config内容中生成一个。MyApp.DataAccess.dll.config将and添加MyApp.DataAccess.dll到您的 Web 应用项目并确保标记Copy To Output DirectoryCopy if newerfor MyApp.DataAccess.dll.config

于 2013-03-29T08:31:53.367 回答