C# 不可为空的字符串类型,如何与Asp.Net核心选项一起使用
她说 我的目的是表示,MyC# 不可为空的字符串类型,如何与Asp.Net核心选项一起使用,c#,asp.net-core,c#-8.0,nullable-reference-types,C#,Asp.net Core,C# 8.0,Nullable Reference Types,她说 我的目的是表示,MyJwtOptions中的属性Issuer和Audience从不为空。这对于消费者来说是非常合理的选择,不是吗?这些非空值由下面描述的Asp.Net核心验证来确保 但是如果JwtOptions没有构造函数初始化所有属性,那么C#8编译器会报告 警告CS8618不可为空的属性“Issuer”未初始化 由于某些技术原因,Asp.Net核心选项不能有带参数的构造函数。所以我坚持我的意图。我可以关闭nullable checking或声明Issuer和其他属性为nullable,
JwtOptions
中的属性Issuer
和Audience
从不为空。这对于消费者来说是非常合理的选择,不是吗?这些非空值由下面描述的Asp.Net核心验证来确保
但是如果JwtOptions
没有构造函数初始化所有属性,那么C#8编译器会报告
警告CS8618不可为空的属性“Issuer”未初始化
由于某些技术原因,Asp.Net核心选项不能有带参数的构造函数。所以我坚持我的意图。我可以关闭nullable checking或声明Issuer
和其他属性为nullable,但我认为这不是最好的解决方案
在这种情况下有什么优雅的解决方案吗
csproj中的代码片段:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
选项由Startup.cs中的下一个代码配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOptions<JwtOptions>()
.Bind(Configuration.GetSection("JwtOption"))
.ValidateDataAnnotations();
}
如您所见,对于消费者而言,或
受众
或发行人
都不能为空。将这些属性设为null毫无意义。据编译器所知,它尚未初始化,可以是null
。使用!(null原谅运算符)
作为最后手段(并留下注释解释为什么使用!
)
// This should be set by the options binding
public string Issuer { get; set; } = null!;
谢谢,这是一种快速而肮脏的解决方案,正如你所看到的,注释是为了清晰…不是很优雅。我不知道是否可以做得更好?@KarelKral我不这么认为。这是mads和bill在NDC会谈中建议的模式。谢谢,我不知道。显然,不可为null的引用类型带来了很多挑战@这是一个全新的世界,但利大于弊
public HomeController(IOptions<JwtOptions> options)
{
string audience = options.Value.Audience;
string issuer = options.Value.Issuer;
}
// This should be set by the options binding
public string Issuer { get; set; } = null!;