【问题标题】:Using ConfigurationBuilder with standalone libraries将 ConfigurationBuilder 与独立库一起使用
【发布时间】:2019-04-02 13:28:17
【问题描述】:

我正在将一个库从 .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 的值,并通过依赖注入将其作为基本路径传入,但是我真的不想彻底改变我的库的接口。

【问题讨论】:

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


    【解决方案1】:

    这似乎有效

        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"];
        }
    

    【讨论】:

      【解决方案2】:

      不是Directory.GetCurrentDirectory,你不能直接使用

      Assembly.GetExecutingAssembly().Location
      

      【讨论】:

      • 我曾考虑过该选项,但是 location 属性指向实际文件而不是文件夹。我刚试过 var uri = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);它适用于 .NET 核心控制台应用程序,但不适用于 .NET 框架 Web 应用程序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多