将ConfigurationBuilder与独立库一起使用

时间:2018-10-29 15:12:56

标签: c# asp.net-core configuration configurationmanager

我正在将库从.NET框架转换为.NET标准,并且作为其中的一部分,需要转移到新的ConfigurationBuilder样式进行配置管理。

该库由多个组件引用,包括使用.NET框架或.NET核心的Web应用程序和类库。

该库具有自己的配置文件和用于配置管理的内部类。

以下是一个简化的示例:

internal interface IConfigManager
{
    string Name { get; }
}

internal class ConfigManager : IConfigManager
{
    private readonly IConfiguration _config;

    public ConfigManager()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("configTestLibSettings.json");

        this._config = builder.Build();
    }

    public string Name => this._config["name"];
}

public interface IConfigTestLib
{
    string GetName();
}

public class ConfigTestLib : IConfigTestLib
{
    private readonly IConfigManager _configManager = new ConfigManager();

    public string GetName()
    {
        return this._configManager.Name;
    }
}

对于该库的大多数使用者来说,这很好用,我要做的就是确保将configTestLibSettings.json复制到输出文件夹中,并且该类按预期工作。

但是,对于.NET Framework Web应用程序Directory.GetCurrentDirectory(),实际上返回的是IISExpress的位置,而不是生成位置。因此找不到配置文件。

有可能解决这个问题吗?

我知道我可以在Web应用程序中获取HttpRuntime.AppDomainAppPath的值,并通过依赖注入将其作为基本路径传递,但是我真的不想彻底改变我的库的接口

2 个答案:

答案 0 :(得分:0)

您不能只使用

Directory.GetCurrentDirectory

Assembly.GetExecutingAssembly().Location

答案 1 :(得分:0)

这似乎可行

    internal class ConfigManager : IConfigManager
    {
        private readonly IConfiguration _config;

        public ConfigManager()
        {
            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
            var uri = new Uri(codeBase);

            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.GetDirectoryName(uri.LocalPath))
                .AddJsonFile("configTestLibSettings.json");

            this._config = builder.Build();
        }

        public string Name => this._config["name"];
    }