将 IConfiguration 绑定到 C# 记录类型

Rok*_*Rok 5 c# configuration c#-record-type

我想将配置绑定到记录类型。

这是配置类型的定义(它没有无参数构造函数):

public record AppConfiguration(string ConnectionString);
Run Code Online (Sandbox Code Playgroud)

这是示例Main方法:

public static void Main(string[] args)
{
    var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
    AppConfiguration appConfig = new(); // error
    configuration.GetSection("app").Bind(appConfig);
}
Run Code Online (Sandbox Code Playgroud)

如果我将定义转换为:

public record AppConfiguration
{
    public string ConnectionString {get; init;}
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但我宁愿使用记录的“单行”定义。这个用例的记录是正确的吗?

Ian*_*emp 8

record将配置节绑定到s的能力已成为 .NET 团队的一个问题,并已针对 .NET 7+ 实施,因此一旦升级到该版本,这将正常工作\xc2\xad\xc2\xad\xe2\x84 \xa2:

\n
var appConfig = config.GetSection("app").Get<AppConfiguration>();\n
Run Code Online (Sandbox Code Playgroud)\n

Microsoft.Extensions.Configuration.Binder从版本 7.0.0 及更高版本开始,它也已添加到NuGet 包中。

\n

或者,您可以使用 Paul Hiles 的 NuGet 包(他的答案中的链接)。

\n


Mar*_*ara 3

第一种方法的问题在于,通过单行声明,您已经自动定义了主构造函数,该构造函数

导致隐式声明的默认类构造函数(如果存在)被抑制。

在第二种情况下,主构造函数是无参数构造函数,因此它按预期工作。为了消除任何疑虑,init访问器是向后兼容的,因此即使ConnectionString没有直接初始化,它也会采用 value null。我猜该Bind方法将使用反射正确填充它。