我想退回Full-Fat Dtos;即具有基本父实体信息,它的Id和名称,以及转换为子dtos集合的子实体集合;或者删除所有内容并仅返回父实体的ID?
瘦小的选择会出现,导致很多回调给web-api填写缺失的细节,但如果一个实体有很多孩子,大孩子等等,那么全脂dto会是一个相当重的对象。关系。
是否有一个半脱脂选项来停止某个级别的序列化?
添加一些额外的上下文:我们正在包装第三方api以供内部使用。第三方使用“瘦”方法返回~18,000个实体,大约18mb。
为了使这不仅仅是一组id,我们需要添加至少一些上下文。 Id和Name实体很简单,但是相关字段可能具有子关系,由于底层数据库设计导致有趣的循环关系,所以事情变得有趣......
答案 0 :(得分:3)
我总是倾向于“全脂”" DTO方法,正如你所说的那样。性能是一项功能,并且没有比添加大量不必要的网络延迟更好的方法来降低性能。
我会说,除非你处理资源紧张的机器,而不是全脂机器,这有利于减少往返服务器的往返次数。
您还没有提供太多信息,但我想您在这里支持数据库表?如果是这样,我更愿意公开"实体"作为单个DB记录的纯粹表示(显然省略了敏感字段)。并创建一个RESTful API来公开和导航它。
编辑:详细说明我的意思"全脂" (注意: 省略了某些多余的细节以减少冗长。)
示例SQL设置:
create table dbo.User (
Id int identity primary key,
Name nvarchar(50)
);
create table dbo.Post (
Id int identity primary key,
UserId int not null foreign key references dbo.User(Id),
Title nvarchar(50),
Body nvarchar(max)
);
示例CLR对象:
public sealed class User
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Post> Posts { get; set; }
}
public sealed class Post
{
public int Id { get; set; }
public int UserId { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public User User { get; set; }
}
鉴于上述设置,有关如何RESTful公开对象的示例如下:
/api/users /*users collection*/
/api/users/1 /*user resource*/
/api/users/1/posts /*user resource with posts sub-collection*/
/api/posts /*posts collection*/
/api/posts/1?user=1|0 /*post resource with/without User*/
答案 1 :(得分:2)
答案是“你需要”全脂“Dto?”
仅返回您需要的数据。 例如,客户订单结构
customer.Id
和customer.Name
的方法,您只能返回{ Id: 1, Name: "One" }
{ Id: 1, Name: "One", Street: "Street 12", City: "City" }
不要试图从一开始就是通用的,开发应用程序所需的具体API方法,然后你可以看到整个图片和重构方法更通用,玩不同的权衡
答案 2 :(得分:0)
选择完全取决于您必须应用解决方案的上下文。
我通常将两者混合在一起。如果我有一个&#39; master-detail&#39;视图类型,例如网上商店,我必须在列表中显示产品,用户只能看到产品的名称和价格,然后我选择一个“瘦”的产品。版。然后,用户可以点击产品查看详细信息页面,我发送全脂的&#39;版本
但是如果有一个与每个产品相关联的类别,我可能只会发送categoryid,也可能会在&#39;详细信息中发送该类别的名称。产品dto。然后,当用户点击某个类别以查看类别详细信息以及其他产品时,我会发送其余产品。