不可为空的字符串类型,如何与Asp.Net Core选项一起使用

Kar*_*ral 7 c# asp.net-core c#-8.0 nullable-reference-types

MS状态使用可为空和不可为空的引用类型更清楚地表达您的设计意图

我的目的是表达属性,Issuer并且Audience在我JwtOptions中永远不会为空。对于这些选项的消费者来说,哪个是非常合理的意图,不是吗?这些非空值由下面描述的Asp.Net Core验证来确保。

但是如果JwtOptions不是所有属性都由构造函数初始化,那么C#8编译器会报告

警告CS8618不可初始化的属性'Issuer'未初始化。

并且由于某些技术原因,Asp.Net Core选项不能具有带参数的构造函数。所以我坚持自己的意图。我可以关闭可为空的检查或声明Issuer和其他可为空的属性,但是我认为这不是最好的解决方案。

在这种情况下,有什么优雅的解决方案吗?

csproj的片段:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <LangVersion>8.0</LangVersion>
  <Nullable>enable</Nullable>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我在Asp.Net Core应用程序中具有以下强类型选项:

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

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

}
Run Code Online (Sandbox Code Playgroud)

选项由Startup.cs中的下一个代码配置:

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

        services.AddOptions<JwtOptions>()
            .Bind(Configuration.GetSection("JwtOption"))
            .ValidateDataAnnotations();
    }
Run Code Online (Sandbox Code Playgroud)

并被消耗HomeController

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

如您所见,对于使用者而言,nor AudienceIssuer不能为null。使这些属性可为空是没有意义的。

Dan*_*ite 9

据编译器所知,它尚未初始化,可以是null。将!(null-forgiving operator)用作最后的手段(并在注释中说明使用原因)!

// This should be set by the options binding
public string Issuer { get; set; } = null!; 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是某种快速而肮脏的解决方案,正如您所看到的,为了清晰起见,需要评论......不是很优雅。不知道能不能做得更好? (2认同)
  • @KarelKral 我不这么认为。这是 mads 和 bill 在 NDC 会谈中建议的模式。 (2认同)
  • 谢谢,我不知道。显然,不可为空的引用类型带来了许多挑战。 (2认同)