此要求来自测试Angular .我对IOptions模式很满意,因为它应该只从配置中加载它所拥有的内容,然后您可以使用验证来确保Options对象具有它所需要的东西.然而,当使用上述选项测试其他部件时,这就成了一个问题,因为您可以只使用所需的少量内容来更新该选项对象.

在我的例子中,我的Options对象如下:

public sealed record SomeOptions
{
    public string Name { get; set; }
    public string Description { get;, set; }
    public Uri Location { get; set; }
}

我希望确保每当在测试中创建SomeOptions时,名称和位置都是强制性的,以反映正常情况下验证将涵盖的内容.使用SomeOptions的无效实例进行测试看起来像是会回来咬我一口.

通常,我会通过构造函数鼓励这样做,但当它try 构建配置时,由于需要无参数构造函数,这会抛出InvalidOperationException异常.这里最好的方法是什么?我目前在一个无参数的构造函数中插入了一个XML注释,声明"不要使用",但这似乎远远不够.

推荐答案

如果您可以迁移到C#11(以及极有可能的.NET 7),则可以使用新引入的required修饰符:

public sealed record SomeOptions
{
    public required string Name { get; set; }
    public string Description { get; set; }
    public required Uri Location { get; set; }
}

如果不是,那么唯一的 Select 就是自己写custom analyzer.

Csharp相关问答推荐

如何基于记录数组,在一次拍摄中更新单个MongoDB集合的多个记录中的子嵌入文档?

元素存在方法是否损坏

在包含空项的列表上使用具有断言T的摘要表

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

. NET 8 HttpClient post参数将其情况更改为camel'

Unity 2D自顶向下弓旋转

如何分配对象后的class的属性?

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

如何使用XmlSerializer序列化带有CDATA节的XML文件?

在Docker容器中运行API项目时,无法本地浏览到index.html

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

在PostgreSQL上使用ExecuteSqlRawAsync的C#11原始字符串文字有区分大小写的问题

.NET 8在appsettings.json中核心使用词典URI、URI&>

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

C#System.Commandline:如何向命令添加参数以便向其传递值?

我是否应该注销全局异常处理程序

.NET8支持Vector512,但为什么向量不能达到512位?

如何使ExecuteAsync异步运行