Я конвертирую библиотеку из .NET Framework в стандарт .NET, и в связи с этим необходимо перейти к новому стилю ConfigurationBuilder для управления конфигурацией.
На библиотеку ссылаются несколько компонентов, включая веб-приложения и библиотеки классов, использующие .NET Framework или .NET core.
Библиотека имеет собственный конфигурационный файл и внутренний класс для управления конфигурацией.
Ниже приведен сокращенный пример:
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 Directory.GetCurrentDirectory()
фактически возвращает местоположение для IISExpress, а не расположение сборки. Поэтому файл конфигурации не найден.
Можно ли обойти это?
Мне известно, что я могу получить значение HttpRuntime.AppDomainAppPath
в своем веб-приложении и передать его в качестве базового пути посредством внедрения зависимостей, однако я не очень хочу радикально изменять интерфейс моей библиотеки.