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