簡體   English   中英

不可為空的字符串類型,如何與 Asp.Net Core 選項一起使用

[英]Non-nullable string type, how to use with Asp.Net Core options

MS 狀態使用可為空和不可為空的引用類型更清楚地表達您的設計意圖

我的意圖是表達,我的JwtOptions中的屬性IssuerAudience永遠不會為空。 對於這些選擇的消費者來說,這是非常合理的意圖,不是嗎? 這些非空值由下面描述的 Asp.Net Core 驗證確保。

但是如果JwtOptions沒有構造函數初始化的所有屬性,那么C#8編譯器會JwtOptions

警告 CS8618 不可為 null 的屬性“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都不能為 null。 使這些屬性可以為空是沒有意義的。

據編譯器所知,它尚未初始化,可以為null 使用!(null-forgiving operator)作為最后的手段(並發表評論解釋您為什么使用!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM