Тип строки не обнуляемый, как использовать с опциями Asp.Net Core - PullRequest
0 голосов
/ 03 марта 2019

Состояния MS Четко выразите свое намерение в дизайне с помощью допустимых и ненулевых ссылочных типов .

Я намерен выразить, что свойства Issuer и Audience в моем JwtOptions никогда не равны нулю.Что является очень разумным намерением для потребителей этих вариантов, не так ли?Эти ненулевые значения обеспечиваются проверкой ядра Asp.Net, описанной ниже.

Но если JwtOptions имеет не все свойства, инициализированные конструктором, значит, компилятор C # 8 сообщает

Предупреждение CS8618 Не обнуляемое свойство Issuer не инициализировано.

И по некоторым техническим причинам в параметрах Asp.Net Core не может быть конструктора с параметрами.Так что я застрял с моим намерением.Я могу отключить проверку Nullable или объявить Issuer и другие свойства Nullable, но я думаю, что это не лучшее решение.

Есть ли какое-нибудь элегантное решение в этом случае?

Фрагмент из csproj:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <LangVersion>8.0</LangVersion>
  <Nullable>enable</Nullable>
</PropertyGroup>

У меня есть строго типизированные параметры в приложении Asp.Net Core:

public class JwtOptions
{
    [Required]
    public string Issuer { get; set; }

    [Required]
    public string Audience { get; set; }

}

Параметры настраиваются следующим кодом в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddOptions<JwtOptions>()
            .Bind(Configuration.GetSection("JwtOption"))
            .ValidateDataAnnotations();
    }

и используются HomeController:

    public HomeController(IOptions<JwtOptions> options)
    {
        string audience = options.Value.Audience;
        string issuer = options.Value.Issuer;
    }

Как видите, ни Audience или Issuer не могут быть нулевыми для потребителя.Делать эти свойства обнуляемыми не имеет смысла.

1 Ответ

0 голосов
/ 03 марта 2019

Насколько знает компилятор, он не был инициализирован и может быть null.Используйте !(null-forgiving operator) в качестве крайней меры (и оставьте комментарий, объясняющий, почему вы использовали !.

// This should be set by the options binding
public string Issuer { get; set; } = null!; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...