全脂或瘦DTO物品?

时间:2017-09-11 11:44:50

标签: c# asp.net json dto

我想退回Full-Fat Dtos;即具有基本父实体信息,它的Id和名称,以及转换为子dtos集合的子实体集合;或者删除所有内容并仅返回父实体的ID?

瘦小的选择会出现,导致很多回调给web-api填写缺失的细节,但如果一个实体有很多孩子,大孩子等等,那么全脂dto会是一个相当重的对象。关系。

是否有一个半脱脂选项来停止某个级别的序列化?

添加一些额外的上下文:我们正在包装第三方api以供内部使用。第三方使用“瘦”方法返回~18,000个实体,大约18mb。

为了使这不仅仅是一组id,我们需要添加至少一些上下文。 Id和Name实体很简单,但是相关字段可能具有子关系,由于底层数据库设计导致有趣的循环关系,所以事情变得有趣......

3 个答案:

答案 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.Idcustomer.Name的方法,您只能返回{ Id: 1, Name: "One" }
  • 对于需要更多客户信息的方法,您将返回更多信息 { Id: 1, Name: "One", Street: "Street 12", City: "City" }
  • 对于需要更复杂数据的方法,您将创建api 返回更复杂的数据

不要试图从一开始就是通用的,开发应用程序所需的具体API方法,然后你可以看到整个图片和重构方法更通用,玩不同的权衡

答案 2 :(得分:0)

选择完全取决于您必须应用解决方案的上下文。

我通常将两者混合在一起。如果我有一个&#39; master-detail&#39;视图类型,例如网上商店,我必须在列表中显示产品,用户只能看到产品的名称和价格,然后我选择一个“瘦”的产品。版。然后,用户可以点击产品查看详细信息页面,我发送全脂的&#39;版本

但是如果有一个与每个产品相关联的类别,我可能只会发送categoryid,也可能会在&#39;详细信息中发送该类别的名称。产品dto。然后,当用户点击某个类别以查看类别详细信息以及其他产品时,我会发送其余产品。