C# 全脂肪还是瘦DTO对象?
我是否要退回全脂DTO;i、 e.具有基本父实体信息,其Id和名称,以及转换为子DTO集合的子实体集合;还是将所有内容剥离,只返回父实体的ID “瘦”选项将导致大量调用web api以填充缺少的细节,但如果实体具有多个子、孙子等关系,则完整的胖dto将是一个相当重的对象 是否有一个半略读选项可以在某个级别停止dto序列化 添加一些额外的上下文:我们正在包装一个供内部使用的第三方api。第三方使用“瘦”方法返回约18000个实体,约18mbC# 全脂肪还是瘦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集合,我们需要至少添加一些上下文
为了使它不仅仅是一个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 返回更复杂的数据
- 对于只使用
和customer.Id
的方法,您只能返回customer.Name
{Id:1,Name:“One”}
- 对于需要更多客户信息的方法,您将返回更多信息
{Id:1,名称:“一”,街道:“12号街”,城市:“城市”}
- 对于需要更复杂数据的方法,您将创建api 返回更复杂的数据
不要从一开始就尝试通用,开发应用程序所需的具体API方法,这样您就可以看到整体情况,并将方法重构为更通用的方法,进行不同的权衡这在其当前形式中并不是真正可以回答的问题。没有银弹。答案是“视情况而定”。只有你知道你到底需要什么,哪些选择是可行的。这在目前的形式下并不是真的可以回答的。没有银弹。答案是“视情况而定”