Использование ConfigurationBuilder с автономными библиотеками - PullRequest
0 голосов
/ 29 октября 2018

Я конвертирую библиотеку из .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 в своем веб-приложении и передать его в качестве базового пути посредством внедрения зависимостей, однако я не очень хочу радикально изменять интерфейс моей библиотеки.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Это похоже на работу

    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"];
    }
0 голосов
/ 29 октября 2018

Вместо Directory.GetCurrentDirectory , вы не можете просто использовать

Assembly.GetExecutingAssembly().Location
...