gpt4 book ai didi

c# - ASP.NET MVC4 Web API - 控制返回的 JSON 的格式以及包含什么?

转载 作者:行者123 更新时间:2023-12-02 05:30:22 24 4
gpt4 key购买 nike

我正在创建我的第一个 ASP.NET MVC4 Web API。我有一个数据库,其中包含 20 个左右的实体,这些实体已在 Azure 上创建和托管,并使用 Entity Framework 将数据库逆向工程为 POCO 类。

他们最终看起来像这样:

public class Activity
{
public Activity()
{
this.ActivityCategories = new List<ActivityCategory>();
this.ActivityImages = new List<ActivityImage>();
this.PerformedActivities = new List<PerformedActivity>();
this.UserActivities = new List<UserActivity>();
}

public int ActivityID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Thumbnail { get; set; }
public virtual Image Image { get; set; }
public virtual ICollection<ActivityCategory> ActivityCategories { get; set; }
public virtual ICollection<ActivityImage> ActivityImages { get; set; }
public virtual ICollection<PerformedActivity> PerformedActivities { get; set; }
public virtual ICollection<UserActivity> UserActivities { get; set; }
}

然后,我创建了一个 ApiController 扩展类,其操作如下:

    public IEnumerable<Activity> All()
{
return db.Activities.ToArray();
}

而且,正如预期的那样,它返回了一个非常长的 JSON 回复。 JSON 回复包括 Activity 类中定义的所有内容。但是,如果我不想包含所有内容怎么办?例如,我不想返回 UserActivities、PerformedActivities 等内容。

基本上我希望我的 JSON 看起来像这样:

[
{
"id":"32",
"name":"this activity name",
"description":"blah blah",
"thumbnail":"http://mydomain.com/images/32/thumbnail.png",
"images": [
{
"name":"this image",
"url":"http://mydomain.com/images/32/1.png",
},
{
"name":"cool image",
"url":"http://mydomain.com/images/32/2.png",
},
],
},
...
]

(忽略我的 JSON 中的任何格式错误,只是非常快速地键入示例)

请注意,我也不想一定要使用相同的属性名称。有没有一种有效的方法可以将我的数据整理成我想要的格式?

我的第一个想法是将每个事件复制到只包含我想要的属性的结构数组中。有没有更优雅的解决方案?

最佳答案

在这种情况下,DTO 对象会拯救您,DTO 将为您的消费者提供足够的数据,因此定义需要通过 Web API 传输数据的 DTO。在某些情况下,您可以使用 EF 中的模型,但是:

  1. 通常,EF 会在后台生成动态代理以支持延迟加载和跟踪更改。您可能遇到的问题是序列化问题,因为 Web API 将序列化代理,而不是您的 POCO 对象。

  2. 向消费者传输过多不必要的数据会使 HTTP 请求变得繁重并暴露数据泄漏。

  3. 违反关注点分离,当 EF 模型是域实体时,它们不承担作为数据传输对象的责任。

在您的示例中,您可以定义 ActivityDto,并消除您提到的不必要的属性:

public class ActivityDto
{
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Thumbnail { get; set; }
public virtual Image Image { get; set; }
}

public IEnumerable<Activity> All()
{
return db.Activities.Select(a => new ActivityDto(){
Name = a.Name,
Description = a.Description,
Thumbnail = a.Thumbnail
// More properties if you need

}).ToArray();
}

如果您想寻找一种工具将 DTO 自动映射到 EF 模型,AutoMapper在这里。

关于c# - ASP.NET MVC4 Web API - 控制返回的 JSON 的格式以及包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com