Asp. Net Базовая конфигурация в классе stati c - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу прочитать URL из моих appsettings. json файл в классе stati c. Я пробовал что-то вроде

private static string Url => ConfigurationManager.GetSection("Urls/SampleUrl").ToString();

Но всякий раз, когда я пытаюсь вызвать метод GetSection(), я получаю нулевое значение.

  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "ConnectionStrings": {
    "cs1": "some string",
    "cs2": "other string"
  },
  "Urls": {
    "SampleUrl": "google.com"
  },
  "AllowedHosts": "*"

Я просто хочу прочитать некоторые данные из настроек приложения. Согласно документам, я не должен каким-либо образом регистрировать мои стандартные наборы приложений. json файл, потому что Host.CreateDefaultBuilder(args) в классе Program делает это для меня по умолчанию.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2020

Как уже упоминалось здесь , вы можете добавить свойство stati c к вашему Startup.cs

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    StaticConfig = configuration;
}

public static IConfiguration StaticConfig { get; private set; }

и использовать в классе stati c:

var x = Startup.StaticConfig.GetSection("whatever");

1 голос
/ 25 апреля 2020

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);
  }
}
0 голосов
/ 25 апреля 2020

Использовать ...

Configuration.GetSection("Urls").GetValue<string>("SampleUrl");

Обновление: извините, это основано на предположении, что конфигурация уже была введена в

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...