gpt4 book ai didi

c# - 我可以使用 C# 9 记录作为 IOptions 吗?

转载 作者:行者123 更新时间:2023-12-03 15:08:54 25 4
gpt4 key购买 nike

我刚刚开始玩 C# 9 和 .NET 5.0,特别是新的 record构造。我发现我有很多关于记录类型速记语法的优秀用例。
我考虑过的用例之一是使用 record用于 IOptions<> 中的 dto ,而不是常规类,用于 ASP.NET Core 应用程序。这些选项类通常很简单,所以我认为它非常适合,但似乎我不能让它轻松工作,因为使用 IOptions<> 配置应用程序要求对象具有无参数构造函数。

public record MyOptions(string OptionA, int OptionB);

public class Startup
{
public void ConfigureServices(IServiceCollection services) {
services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
}
...
}

public class MyController : Controller
{
private readonly MyOptions _options;
public MyController(IOptions<MyOptions> options) {
_options = options.Value; // This throws an exception at runtime
}
}

上面的示例在尝试访问 IOption<>.Value 时抛出以下异常属性:

System.MissingMethodException: 'No parameterless constructor defined for type 'AcmeSolution.MyOptions'.'


有没有办法配置 IOptions配置系统使用记录的构造函数反序列化选项而不是需要无参数的构造函数?
我可以对记录使用普通语法,但是使用类确实没有任何好处。

最佳答案

Is there any way to configure the IOptions configuration system to deserialize the options using the record's constructor instead of requiring a parameterless constructor?


不,通常 ASP.Net Core 使用大量运行时类型实例化,这需要事先知道的构造函数调用,在这种情况下,它需要一个没有参数的构造函数。
但是,您可以使您的记录类具有无参数构造函数:
public record MyOptions(string OptionA, int OptionB)
{
public MyOptions(): this(default, default) {}
}
这值得么?诶。由你决定。在性能方面,它并不比普通类(class)差,所以选择任何你觉得更清晰的类(class)!
编辑:或者,您应该可以使用此表单:
public record MyOptions(string OptionA = default, int OptionB = default);

关于c# - 我可以使用 C# 9 记录作为 IOptions 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64933022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com