我有一个使用选项模式进行配置的 .NET 8 应用程序:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-8.0
在我的 appSettings 文件中,我有以下部分
"TokenOptions": {
"BaseUri": "a-uri",
"Username": "a-username",
"Password": "a-password"
}
在我的应用程序中,在ConfigureServices()中,我执行以下操作:
serviceCollection.Configure<TokenOptions>(configuration.GetSection(nameof(TokenOptions)));
serviceCollection.AddTransient(resolver => resolver.GetService<IOptionsMonitor<TokenOptions>>().CurrentValue);
然后,通过依赖注入,我可以使 TokenOptions 在任何类中可用,并且它将具有来自 appSettings 的值。
现在,我遇到了某些情况,appSettings 文件中的 TokenOptions 部分可能丢失或不完整,例如缺少 BaseUri 属性。
是否可以在我的应用程序启动时验证整个部分或其属性之一是否缺失,并在配置服务之前使用默认的硬编码值?
我不想用缺少的值更新实际的 appSettings 文件,但如果文件中缺少默认值,则只需在整个应用程序中使用默认值。因此,一旦我的应用程序启动并且我需要类中的 TokenOptions 实例,它应该解析为类似以下内容:
tokenOptions.BaseUri: "a-hardcoded-default-value";
tokenOptions.Username: "a-username"; //the value from appSettings
tokenOptions.Password: "a-password; //the value from appSettings
假设您的配置如下所示:
"TokenOptions" : {
"BaseUri" : "tmp",
"UserName": "myUsareName",
"Password": "MySecretPasswd!"
}
如果您想验证此部分,您必须执行以下操作:
builder.Services.AddOptions<TokenOptions>()
.Bind(builder.Configuration.GetSection(nameof(TokenOptions)))
.ValidateDataAnnotations()
.ValidateOnStart();
var tokenOptions = builder.Configuration.GetSection(nameof(TokenOptions)).Get<TokenOptions>();
TokenOptions.cs 文件:
public class TokenOptions
{
[Required]
public string? BaseUri { get; set; }
public string UserName { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
如果缺少必需的属性,您的应用程序将在启动时崩溃。
如果您想使用属性的一些默认值而不是字符串。空使用例如:“localhost:5001”
public string BaseUri { get; set; } = "localhost:5001";
检查此选项以获取更多验证选项: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-9.0