0

所以让我先说“我知道这不是最佳实践”,并且我不想将 app.config 文件中的信息添加到 web.config 文件中......我有一个项目本身就是一个类库,它也将使用很多类库。

通常在我的单元测试项目(用于测试)或我的 Web 项目(在生产中使用 lib)中,我必须添加所有配置信息。这些库的调用方式不会与每个项目不同,因此我正在寻找一种方法来让调用项目读取被调用项目的配置文件。

我在网上看过,到目前为止我发现的仅有的两件事是:

1)不要这样做。您需要将信息添加到调用项目的配置文件中

示例 a)从类库项目中的 App.config 读取

示例 b) ASP.NET 中的类库项目从 web.config 而不是 app.config 读取

示例 c)库项目中的 .Net app.config

2)你不应该这样做,但我知道如何(不包括:/)

示例 a)类库的 app.config

一段时间以来,我一直在以“正确”的方式进行操作,这给我留下了很多 web.config 和测试项目配置文件,其中包含从类 lib app.config 文件中复制的信息。我确实认为这样做有一个特定的、合理的用例。

谢谢!

4

1 回答 1

1

我所知道的最佳实践是避免从库中的类,甚至一般类中直接依赖 app.config/web.config。这并不意味着您不使用 app.config。这意味着您的班级不知道他们正在使用它。

例如,

public class MyClassThatDependsOnSomeSettings
{
    private readonly ISettings _settings;

    public MyClassThatDependsOnSomeSettings(ISettings settings)
    {
        _settings = settings;
    }

    public void DoSomething()
    {
        var settingA = _settings.SettingA;
    }
}

public interface ISettings
{
    int SettingA {get;}
    string SettingB {get;}
}

现在可以考虑MyClassThatDependsOnSomeSettings完成了。它不需要对 .config 文件进行任何访问。它只需要一个实现的实例ISettings可以从 .config 中读取。

public class SettingsFromConfiguration : ISettings 
{
    public int SettingA 
    {
        get 
        {
            string setting = ConfigurationManager.AppSettings["settingA"];
            int value = 0;
            int.TryParse(setting, out value);
            return value;
        }
    }

    public string SettingB 
    {
        get { return ConfigurationManager.AppSettings["settingB"];}
    }
}

看起来这只是移动事物并做同样的事情吗?几乎可以。最大的区别在于,虽然您可以使用ISettings从 app.config 读取的实现,但您也可以编写其他实现。您可以编写一个使用硬编码值的程序,您可以编写一个自定义配置部分而不是 using AppSettings,或者如果您有一个带有 JSON 配置文件的应用程序并且没有AppSettings您的类仍然可以工作。

这适用于依赖倒置,这意味着类应该依赖于抽象(如接口)而不是具体的实现。

在构造函数中添加一个要求ISettings称为依赖注入,特别是构造函数注入。

于 2016-08-16T14:02:26.490 回答