Невозможно прочитать / связать параметры конфигурации со строго типизированным классом, используя именованные параметры в Asp. Net Core 3 - PullRequest
0 голосов
/ 09 апреля 2020

Я не могу связать параметры конфигурации в моих настройках приложения. json с классом строго типов с использованием именованных параметров.

appsettings. json

"CJSettings": {
    "Normal": {
      "CSSUrl": "https://css.mydomain.com/main.min.css",
      "LogoName": "mysite-logo.png"
    },
    "WL": {
      "CSSUrl": "https://css.mydomain.com/main_wl.min.css",
      "LogoName": "mysite-WL-logo.png"
    },
    "SEG": {
      "CSSUrl": "https://css.mydomain.com/main_seg.min.css",
      "LogoName": "mysite-seg-logo.png"
    }}

CJSettings.cs

public class CJSettings
{
    public string CSSUrl { get; set; }
    public string LogoName { get; set; }
}

Startup.cs

services.Configure<CJSettings>("Normal", configuration.GetSection("CJSettings.Normal"));
services.Configure<CJSettings>("WL", configuration.GetSection("CJSettings.WL"));
services.Configure<CJSettings>("SEG", configuration.GetSection("CJSettings.SEG"));

NormalService.cs

Мой сервис, где я пытаюсь прочитать данные конфигурации, используя имя. но безуспешно.

public class NormalService : INormalService
{
    private readonly CJSettings cjSettings;

    public NormalService(IOptionsMonitor<CJSettings> options)
    {
        this.cjSettings = options.Get("Normal");    //getting null values for both properties
    }
}

Как вы можете видеть выше, я пытался читать данные, используя имя "Normal", но я получаю нулевые значения для обоих свойств объекта CJSettings.

named-options-read-null

пожалуйста, помогите мне исправить это ... Спасибо

1 Ответ

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

Я не знаю, почему ваш код не работает. Я могу предложить следующее решение, которое я всегда использую:

public class CJSettings
{
    public UrlSettings Normal { get; set; }
    public UrlSettings WL { get; set; }
    public UrlSettings SEG { get; set; }
}

public class UrlSettings
{
    public string CSSUrl { get; set; }
    public string LogoName { get; set; }
}

Регистрация параметров и служб:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CJSettings>(Configuration.GetSection(nameof(CJSettings)));
        services.AddTransient<INormalService, NormalService>();

        // the rest of your code
    }

Затем добавьте параметры в конструктор службы:

public class NormalService : INormalService
{
    private readonly CJSettings cjSettings;

    public NormalService(IOptions<CJSettings> options)
    {
        this.cjSettings = options.Value ?? throw new ArgumentNullException(nameof(CJSettings));
    }
}

Это должно работать. Я проверил это.

ОБНОВЛЕНО

На самом деле ваш код в порядке. Вам просто нужно использовать двоеточия вместо точек в ключевом параметре метода GetSection:

services.Configure<CJSettings>("Normal", Configuration.GetSection("CJSettings:Normal"));
services.Configure<CJSettings>("WL", Configuration.GetSection("CJSettings:WL"));
services.Configure<CJSettings>("SEG", Configuration.GetSection("CJSettings:SEG"));
...