如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)

Posted

技术标签:

【中文标题】如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)【英文标题】:How to return different Object Type based on Condition in HTTP Response (.net core) 【发布时间】:2020-08-25 16:48:33 【问题描述】:

我有一个 EF 模型类、一个 DTO BaseClass 和一个从 BaseClass 扩展的 DTO AdminClass。我从 EF 获取数据并使用 AutoMapper 类使用下面的代码转换为适当的对象。

public async Task<object> GetItems()

    object nearestItems = _dbContext.Items.ToList(); // Gets it from DBContext.Items....
    var dtoList = IsAuthenticated ? MapObject<IEnumerable<AdminClass>>(nearestItems) : MapObject<IEnumerable<BaseClass>>(nearestItems);
    return dtoList;


private T MapObject<T>(object obj)

    object convertedObject = null;
    //convertedObject = IsAuthenticated ? _mapper.Map<IList<AdminClass>>(obj) : _mapper.Map<BaseClass>(obj);
    return (T)convertedObject;

但是当响应被发回时,这只会返回BaseClass 属性,即使它已经过身份验证并且应该返回AdminClass 属性以及BaseClass。为了返回适当的对象,我必须使用 If/Else 条件,而不是 三元 运算符,并且必须使用 AdminClassWithoutBaseClass 来返回所有属性。虽然不理想,因为我必须在之后进行一些其他操作,但它确实有效。但是,我想知道如何使它与上述语法一起使用,以及是否有一种简洁的编写方式。

您可以在Dotnetfiddle 上查看示例代码。

【问题讨论】:

【参考方案1】:

这听起来像是延迟加载问题。在 .net Core 上,您必须使用代理启用延迟加载扩展属性。这是一篇关于它的深入博客文章:https://www.learnentityframeworkcore.com/lazy-loading

您需要添加 Microsoft.EntityFrameworkCore.Proxies nuget 包,并在实例化上下文服务时启用它。

services.AddDbContext<SomeContext>(options =>
    options.UseLazyLoadingProxies());

【讨论】:

我认为它与 EF 或延迟加载无关。列表已经缓存在内存中(使用 .net 核心缓存)并且已经将数据转换为适当的类型。问题是当 HTTP 响应被发送回来时,它只返回基本类型的属性。 因此,如果您在其中设置断点并查看缓存返回的内容,然后再将其作为 http 响应发送,它实际上是否包含 AdminClass 的值? FYI 缓存用于 EF 列表,因此我不必往返 DB。是的,我确实在控制器操作上看到了 AdminClass List return list;,但在响应基类列表上。 你结婚了吗?我可以通过手动转换来完成。完整示例太长,无法评论... dotnetfiddle上手动转换的工作示例

以上是关于如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过查询条件片段中的空对象?

如何反序列化具有相同名称但不同类型的 API 响应

Java 基础知识 复习笔记

Web API 2 的操作结果

java中的多态

TypeScript 条件类型和计算对象属性名称