如何创建通用端点以适应七种不同类型的端点?

How can a generic endpoint be created to accommodate seven different types?

提问人:capslo 提问时间:6/16/2023 最后编辑:Floriancapslo 更新时间:6/16/2023 访问量:52

问:

嗨,我正在尝试创建通用端点以允许所有这些类型和大多数属性的名称,因为对于 db 中的某些类型,我有 2 个单元格(date1,date2)。我正在尝试使用 T 类型,但是当我调用端点时,我得到 404。稍后我需要有关类型的知识来更新数据库中的正确单元格。我不知道,也许为每种类型创建七个端点会更好。最佳做法是什么?我已经看到了 Jobject 的一些解决方案,但很难将其转换为对象。

FirstEnum?
SecondEnum?
DateTime? GenericDate1
DateTime? GenericDate2
String?
bool?
int? GenericInt1
int? GenericInt2
decimal?

允许所有这些类型的终结点:

public async Task<IActionResult> UpdateData<T>(long id, [FromBody] T value) 
{
    var result = await _dataService.UpdateData(id, value);
    if (!result)
        return NotFound();
    return Ok(result);
}

保存到数据库,只是为了显示我的意思的一部分:

private async Task UpdateData(T newValue)
{
    switch (newValue)
    {
        case FirstEnum first:
            existingDataPoint.FirstEnum = first;
            break;
        case SecondEnum secondEnum :
            existingDataPoint.SecondEnum = secondEnum ;
            break;
        case bool genericBool:
            existingDataPoint.GenericBool = genericBool;
            break;
        case DateTime genericDate when newValue.Name == "GenericDate1":
            existingDataPoint.GenericDate1 = genericDate;
            break;
        case DateTime genericDate when newValue.Name == "GenericDate2":
            existingDataPoint.GenericDate2 = genericDate;
            break;
    }
}
C# 泛型强制 类型转换 终结点

评论

1赞 Oliver 6/16/2023
AFAIK:您不能使用通用方法作为路由的控制器模块。相反,创建一个非泛型方法,它采用一个(非抽象)基类。当传入数据为 JSON 时,此基类可以具有标有 的属性,其中包含与基类属性不匹配的所有值。然后编写一个转换器,该转换器采用此基类实例并返回具体派生类实例(具体取决于给定值)。然后,这可以通过开关外壳处理并执行任何需要的操作。AdditionalDataAttribute
0赞 capslo 6/16/2023
你的意思是只是创建对象 public class UpdateData { public string NameObject { get; set; } public string Value { get; set; } } 然后解析 NameObject 的值取决于 ?
1赞 Oliver 6/16/2023
还需要一个容器来存储所有 json 数据,该数据与任何属性都不匹配。看一看:learn.microsoft.com/en-us/dotnet/standard/serialization/...
0赞 capslo 6/16/2023
好的,谢谢。也许这是唯一的办法。不好的是,在我到达端点之前,我不能使用 fluentValidation,但我什至无法使用 T 做到这一点
1赞 Oliver 6/16/2023
是的,对于流畅的验证,您必须为要在中间件中处理的每种专用类型创建不同的路由终结点。或者,在控制器中运行专用类型的转换器,然后手动调用相应的验证器,如此处所述

答: 暂无答案