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 Audience也Issuer不能为null。使这些属性可为空是没有意义的。
据编译器所知,它尚未初始化,可以是null。将!(null-forgiving operator)用作最后的手段(并在注释中说明使用原因)!。
// This should be set by the options binding
public string Issuer { get; set; } = null!;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1021 次 |
| 最近记录: |