假设我有一个具有以下结构的应用程序。
// ASP.NET MVC (Web Project)
// Service/Business Layer (Class Library)
// DAL (Class Library)
最初我想在DAL类库中使用App.config文件,该文件将保存这样的应用程序设置:
<appSettings>
<add key="DAL-Assembly" value="DAL.LinqToSql.DataContexts"/>
<add key="DAL-Type" value="DAL.LinqToSql.DataContexts.MyDataContext" />
</appSettings>
然后我会使用工厂使用反射
创建数据上下文public static DataContext GetContext()
{
string assembly = ConfigurationManager.AppSettings("DAL-Assembly");
string type = ConfigurationManager.AppSettings("DAL-Type");
Assembly a = Assembly.Load(assembly);
return (DataContext)a.CreateInstance(type);
}
问题是现在我明白类库必须使用调用应用程序的配置文件。这意味着它将在app.config或web.config的演示文稿中查找 - 这似乎不正确。
在这种DAL情况下,保持DAL层中包含的具体DataContext规范的最佳方法是什么,而不必在每次更改时重建?或者甚至在更广泛的意义上,将配置外部保留在DAL层中的最佳方法是什么?
答案 0 :(得分:3)
我会尝试将配置分开并实际将其注入相关层。所以在你的DAL层我可能有一个工厂类来处理特定的数据网关,这个工厂将在其默认构造函数中采用IDataAccessConfiguration参数。然后,您可以在本地配置类中设置静态属性,或在创建时将接口的本地副本传递到上下文中。示例:
public interface IDataAccessConfiguration
{
string Assembly { get; }
string Type { get; }
}
public sealed class DataAccessfactory
{
private IDataAccessConfiguration Config { get; set; }
public DataAccessfactory(IDataAccessConfiguration config)
{
this.Config = config;
}
public ISomeDataContext GetSomeDataContext()
{
return new SomeDataContext(this.Config);
}
}
public class SomeDataContext : ISomeDataContext
{
private IDataAccessConfiguration Config { get; set;}
public SomeDataContext(IDataAccessConfiguration config)
{
this.Config = config;
}
private DataContext GetDataContext()
{
Assembly a = Assembly.Load(this.Config.Assembly);
return (DataContext)a.CreateInstance(this.Config.Type);
}
}
然后,当你真的想从特定的app.config文件中获取设置时,你可以用标准方式完成它,创建一个实现IDataAccessConfiguration的具体类,并使用配置文件中的值设置其成员并传递上课。请参阅此链接,查看我提出的与此相关的问题:Best way of injecting application configuration
这是你要找的东西吗?
答案 1 :(得分:0)
我总是为从.config文件读取的所有值创建一个具有静态只读属性的Config类。它非常有用,因为它可以让您轻松访问强类型值,如果您的网站在web.config中设置了值,或者在测试项目的app.config中设置了值,则不会真正有用。
public class Config
{
public static string QueriesPath
{
get
{
return ConfigurationManager.AppSettings["QueriesPath"].ToString();
}
}
public static string SearchLogConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["SearchLog"].ConnectionString;
}
}
}
我总是使用依赖于设置的项目来保存类似的Config类。在您的场景中,DAL和Service层可能都有这样的类。我也做基本的验证形式,即检查缺失值并抛出适当的异常,以便应用程序尽快失败,或者只返回合理的默认值。
小心地将您的配置值唯一命名,如果我知道该库将在其他方案中使用,我通常在它们前面加上项目名称。