将配置数据保存在类库的外部
本文关键字:类库 外部 存在 保存 配置 置数据 | 更新日期: 2023-09-27 18:11:05
假设我有一个结构如下的应用程序:
// 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。配置-似乎不正确。
在这种DAL情况下,保持具体的DataContext规范包含在DAL层中,而不必在每次更改时重新构建它的最佳方法是什么?或者从更广泛的意义上说,在DAL层中保持外部配置的最佳方法是什么?
我会尝试保持配置独立,并实际将其注入到相关层中。因此,在您的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的具体类,用配置文件中的值设置它的成员,并传递这个类。我问了一个与此相关的问题,请参阅此链接:注入应用程序配置的最佳方式
这是你在寻找的那种东西吗?
我总是为从. Config文件中读取的所有值创建一个具有静态只读属性的Config类。它非常有帮助,因为它让你很容易地访问强类型的值,如果值是在web中设置的,它就不那么容易了。为您的网站配置,或在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;
}
}
}
我总是保持一个像这样的配置类的项目,这取决于设置。在您的场景中,DAL和服务层可能都有这样一个类。我也做基本形式的验证,即检查缺失值并抛出适当的异常,以便应用程序尽快失败,或者只是返回一个合理的默认值。
注意给你的配置值唯一命名,如果我知道这个库将在其他场景中使用,我通常会给它们加上项目名的前缀。