C# 全脂肪还是瘦DTO对象?

C# 全脂肪还是瘦DTO对象?,c#,asp.net,json,dto,C#,Asp.net,Json,Dto,我是否要退回全脂DTO;i、 e.具有基本父实体信息,其Id和名称,以及转换为子DTO集合的子实体集合;还是将所有内容剥离,只返回父实体的ID “瘦”选项将导致大量调用web api以填充缺少的细节,但如果实体具有多个子、孙子等关系,则完整的胖dto将是一个相当重的对象 是否有一个半略读选项可以在某个级别停止dto序列化 添加一些额外的上下文:我们正在包装一个供内部使用的第三方api。第三方使用“瘦”方法返回约18000个实体,约18mb 为了使它不仅仅是一个ID集合,我们需要至少添加一些上下文

我是否要退回全脂DTO;i、 e.具有基本父实体信息,其Id和名称,以及转换为子DTO集合的子实体集合;还是将所有内容剥离,只返回父实体的ID

“瘦”选项将导致大量调用web api以填充缺少的细节,但如果实体具有多个子、孙子等关系,则完整的胖dto将是一个相当重的对象

是否有一个半略读选项可以在某个级别停止dto序列化

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


为了使它不仅仅是一个ID集合,我们需要至少添加一些上下文。Id和名称实体非常简单,可以包含,但相关字段可能有子关系,这是由于底层数据库设计导致的有趣的循环关系,事情变得有趣…

我一直倾向于“全脂”DTO方法,正如您所说的那样。性能是一项功能,没有比增加一堆不必要的网络延迟更好的降低性能的方法了

我会说,除非您处理的是一台资源严重紧张的机器,否则您最好全力以赴,这样可以减少往返服务器的往返次数

您没有提供太多信息,但我想这里有DB表支持吗?如果是这样,我更愿意将“实体”公开为单个DB记录的纯表示(显然省略了敏感字段)。以及创建一个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)
);
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; }
}
示例CLR对象:

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)
);
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; }
}

我一直倾向于你所称的“全脂”DTO方法。性能是一项功能,没有比增加一堆不必要的网络延迟更好的降低性能的方法了

我会说,除非您处理的是一台资源严重紧张的机器,否则您最好全力以赴,这样可以减少往返服务器的往返次数

您没有提供太多信息,但我想这里有DB表支持吗?如果是这样,我更愿意将“实体”公开为单个DB记录的纯表示(显然省略了敏感字段)。以及创建一个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)
);
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; }
}
示例CLR对象:

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)
);
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; }
}

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

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


但是,如果有一个类别与每个产品关联,我可能只会将categoryid和“detail”产品数据中的类别名称发送到。然后,当用户单击某个类别以查看类别详细信息以及其他产品时,我会发送其余内容。

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

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

但是,如果有一个类别与每个产品关联,我可能只会将categoryid和“detail”产品数据中的类别名称发送到。然后,当用户单击某个类别以查看类别详细信息以及其他产品时,我会发送其余的信息。

答案是“您是否需要“全脂”Dto?”

只返回您需要的数据。 例如,客户订单结构

  • 对于只使用
    customer.Id
    customer.Name
    的方法,您只能返回
    {Id:1,Name:“One”}
  • 对于需要更多客户信息的方法,您将返回更多信息
    {Id:1,名称:“一”,街道:“12号街”,城市:“城市”}
  • 对于需要更复杂数据的方法,您将创建api 返回更复杂的数据
不要从一开始就尝试通用,开发应用程序所需的具体API方法,这样您就可以看到整体情况,并将方法重构为更通用的方法,权衡各种不同的利弊。

答案是“您需要完整的Dto吗?”

只返回您需要的数据。 例如,客户订单结构

  • 对于只使用
    customer.Id
    customer.Name
    的方法,您只能返回
    {Id:1,Name:“One”}
  • 对于需要更多客户信息的方法,您将返回更多信息
    {Id:1,名称:“一”,街道:“12号街”,城市:“城市”}
  • 对于需要更复杂数据的方法,您将创建api 返回更复杂的数据

不要从一开始就尝试通用,开发应用程序所需的具体API方法,这样您就可以看到整体情况,并将方法重构为更通用的方法,进行不同的权衡

这在其当前形式中并不是真正可以回答的问题。没有银弹。答案是“视情况而定”。只有你知道你到底需要什么,哪些选择是可行的。这在目前的形式下并不是真的可以回答的。没有银弹。答案是“视情况而定”