API ConfigurationManager
не работает так, как вы ожидаете, в ASP. NET ядре. Он не будет выдавать никаких исключений, но просто возвращает null
всякий раз, когда вы вызываете его методы, поскольку вы испытываете.
В ASP. NET ядре у вас есть новые объекты и API для передачи конфигурации в ваше приложение. Они основаны на идее источников конфигурации, которые можно зарегистрировать с помощью компоновщика конфигурации, который после сборки предоставляет вам объект конфигурации. Источник конфигурации для файла appsettings.json
автоматически учитывается, если вы используете компоновщик хостов по умолчанию, поэтому он у вас есть из коробки. Полная документация доступна здесь .
Другой кусок, который вам не хватает, это контейнер DI, который у вас есть в ASP. NET ядре. Фреймворк строго самоуверен и ведет вас к дизайну, основанному на шаблоне внедрения зависимостей. Каждый раз, когда вашим сервисам нужно что-то, они просто запрашивают это через параметр конструктора, и какой-то другой субъект (контейнер DI) позаботится о разрешении зависимости и внедрении запрошенного объекта. Одним из интерфейсов, которые автоматически регистрируются в контейнере DI, является интерфейс IConfiguration
, который в основном является конфигурацией, которую вы передали своему приложению.
Тем не менее, на мой взгляд, ваш дизайн не правильный. Доступ к конфигурации приложения из класса c не имеет смысла . Классы stati c обычно подразумевают контейнер методов stati c, которые в основном являются функциями, получающими входные данные и создающими выходные данные. Думайте о них как о чистых функциях, которые реализуют вычисления для вас и могут использоваться как помощники для решения конкретной проблемы. Просто для примера рассмотрим следующий класс stati c:
public static class StringHelpers
{
// notice that this is a pure function. This code does not know it is running inside an application having some sort of injected configuration. This is only an helper function
public static string Normalize(string str)
{
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
return str.Trim().ToUpperInvariant();
}
}
Вполне возможно, что ваши методы stati c нуждаются в некоторой конфигурации в качестве входных данных для работы. В этом случае вы должны выбрать следующий дизайн:
public interface IUrlProvider
{
string GetUrl();
}
public class ConfigurationBasedUrlProvider: IUrlProvider
{
private const string DefaultUrl = "https://foo.example.com/foo/bar";
private readonly IConfiguration _appConfiguration;
// ask the DI container to inject the configuration. Here you have the content of appsettings.json for free. Interface IConfiguration is automatically registered with the DI container
public ConfigurationBasedUrlProvider(IConfiguration configuration)
{
_appConfiguration = configuration ?? throw new ArgumentNullException(nameof(configuration));
}
public string GetUrl()
{
var configuredUrl = _appConfiguration.GetSection("Urls")["SampleUrl"];
var safeUrl = string.IsNullOrWhiteSpace(configuredUrl) ? DefaultUrl : configuredUrl;
return StringHelpers.Normalize(safeUrl);
}
}