微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.Net Core webApi 在运行时向传入的 Dto 添加属性

如何解决.Net Core webApi 在运行时向传入的 Dto 添加属性

我有一个核心 webApi 端点的情况。我希望能够将传入的 Json 序列化为 Dto。 Dto 将包含必要的字段,但传入的请求可能包含其他属性(某些客户端不同)。我还需要能够捕获其他属性,但它们只能在运行时知道(记录将存储在 DocumentDB (Mongo) 中)。我正在反序列化为动态对象:

[Route("api/Chapter/CreateNewChapter")]
[HttpPost]
public IActionResult CreateNewChapter([FromBody]dynamic incomingJson) 
{
    dynamic incomingObject = JsonConvert.DeserializeObject<ExpandoObject>(incomingJson.ToString(),new ExpandoObjectConverter());
    if (!IsAuthenticated(incomingObject))
        return Unauthorized();
    var createNewChapter = new CreateNewChapter();

    var outgoingJson = createNewChapter.Process(incomingObject);
    var resultJson = JsonConvert.SerializeObject(outgoingJson,Formatting.Indented);
    return Ok(resultJson);   
}

这工作得很好,问题是没有可用于 Swagger 的架构或具体对象,而且对所有字段的验证是一场噩梦。

所以最终我想做这样的事情:

public class ChapterDto
{
    public int ChapterId {get; set};
    public string ChapterName {get; set};
)

那么如果请求中发送了额外的属性(Json),可以在运行时动态添加这些属性。此外,我将添加元数据属性“ParentChapterId”等。

我是否应该尝试将传入的 json 映射到 dto 以便我知道我们有有效的传入属性,然后如果传递映射整个 Json 对象到动态对象,就像我在上面做的那样?或者有没有更好的方法来实现这一目标?

解决方法

您可以使用 JSON extension data。反序列化时,它会将 DTO 中未找到的其他属性映射到您添加到 DTO 的具有适当属性的字典属性。

示例用法:

public class ChapterDto
{
    public int ChapterId { get; set; }

    public string ChapterName { get; set; }

    [JsonExtensionData]
    public IDictionary<string,JToken> AdditionalData { get; set; }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。