不可为空的字符串类型,如何与 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
中的属性Issuer
和Audience
永远不会为空。对于这些选择的消费者来说,这是非常合理的意图,不是吗?这些非空值由下面描述的 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;
如您所见,Audience
和 Issuer
对于消费者来说都不能为空。让这些属性可以为空是没有意义的。
【问题讨论】:
【参考方案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)