将配置数据保存在类库的外部

本文关键字:类库 外部 存在 保存 配置 置数据 | 更新日期: 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和服务层可能都有这样一个类。我也做基本形式的验证,即检查缺失值并抛出适当的异常,以便应用程序尽快失败,或者只是返回一个合理的默认值。

注意给你的配置值唯一命名,如果我知道这个库将在其他场景中使用,我通常会给它们加上项目名的前缀。