从类库中保持配置数据外部

时间:2011-10-12 04:46:51

标签: c# asp.net appsettings

假设我有一个具有以下结构的应用程序。

// 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层中的最佳方法是什么?

2 个答案:

答案 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层可能都有这样的类。我也做基本的验证形式,即检查缺失值并抛出适当的异常,以便应用程序尽快失败,或者只返回合理的默认值。

小心地将您的配置值唯一命名,如果我知道该库将在其他方案中使用,我通常在它们前面加上项目名称。