如何根据 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 Listreturn list;
,但在响应基类列表上。
你结婚了吗?我可以通过手动转换来完成。完整示例太长,无法评论...
dotnetfiddle上手动转换的工作示例以上是关于如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)的主要内容,如果未能解决你的问题,请参考以下文章