我有一个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文件,无论是谁调用它。这甚至可能吗?任何帮助将不胜感激。
答案 0 :(得分:0)
在运行时,只有一个配置文件。所以活动项目的配置文件只是 考虑。另外,您不能将类库项目作为活动/启动项目,即
假设您的解决方案中有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>
<强> YourSettings.config:强>
<appSettings>
<add key="KeyToOverride" value="Overridden" />
<add key="KeyToBeAdded" value="EntirelyNew" />
</appSettings>
详细了解here
如果您想为您的活动项目本身提供单独的配置文件,那么完全不同于完全不同的故事。 这是一种丑陋的调整,但请阅读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.config
和MyApp.DataAccess.dll
添加到您的网络应用项目中,并确保将Copy To Output Directory
标记为Copy if newer
MyApp.DataAccess.dll.config
。