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

Posted

技术标签:

【中文标题】不可为空的字符串类型,如何与 Asp.Net Core 选项一起使用【英文标题】:Non-nullable string type, how to use with Asp.Net Core options 【发布时间】:2019-07-25 03:54:57 【问题描述】:

MS 声明 Express your design intent more clearly with nullable and non-nullable reference types。

我的意图是表达我的JwtOptions 中的属性IssuerAudience 永远不会为空。对于这些选择的消费者来说,这是非常合理的意图,不是吗?这些非空值由下面描述的 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>

我在 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;
    

如您所见,AudienceIssuer 对于消费者来说都不能为空。让这些属性可以为空是没有意义的。

【问题讨论】:

【参考方案1】:

据编译器所知,它还没有被初始化,可以是null。使用!(null-forgiving operator) 作为最后的手段(并留下评论解释你为什么使用!

// This should be set by the options binding
public string Issuer  get; set;  = null!; 

【讨论】:

谢谢,这是一种快速而肮脏的解决方案,如您所见,为了清晰起见,注释是必需的......不是很优雅。不知道能不能做得更好? @KarelKral 我不这么认为。这是 mads 和 bill 在 NDC 会谈中建议的模式。 谢谢,我不知道。显然,不可为空的引用类型带来了许多挑战。 @KarelKral 这是一个全新的世界,但利大于弊

以上是关于不可为空的字符串类型,如何与 Asp.Net Core 选项一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将“任何不可为空的类型”指定为泛型类型参数约束?

错误无法为不可为空的类型返回 null:父 MyModelType 中的“字符串”(/createMyModelType/id)

ef在asp.net中删除报值不能为空的原因

C# 8 中的不可为空的引用类型在运行时可以为空吗?

asp.net lamda查询表达式判断Guid的值是不是为空

asp.net c# 想实现条件能为空的多条件查询