Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
我想退回全脂Dto吗?即使用基本的父实体信息,即ID和名称,以及将子实体的集合转换为子dto的集合;还是剥离所有内容并仅返回父实体的ID?
出现瘦选项会导致大量调用Web api来填写缺少的详细信息,但是如果实体具有许多子级,子级等关系,则全脂dto将是一个相当沉重的对象。
是否有半精简选项将dto序列化停止在某个级别?
要添加一些其他上下文:我们包装了一个第三方API供内部使用。第三方正在使用“皮包骨头”方法来返回约18,000个实体,大约18mb。
为了使它不仅仅是一个id的集合,我们需要至少添加一些上下文。 Id和Name实体很容易包含,但是其中相关字段可能具有子关系,由于基础数据库设计导致子关系很有趣,使得循环关系变得有趣...
示例CLR对象:
在上述设置的基础上,如何通过REST方式公开对象的示例如下:
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
我想退回全脂Dto吗?即使用基本的父实体信息,即ID和名称,以及将子实体的集合转换为子dto的集合;还是剥离所有内容并仅返回父实体的ID?
出现瘦选项会导致大量调用Web api来填写缺少的详细信息,但是如果实体具有许多子级,子级等关系,则全脂dto将是一个相当沉重的对象。
是否有半精简选项将dto序列化停止在某个级别?
要添加一些其他上下文:我们包装了一个第三方API供内部使用。第三方正在使用“皮包骨头”方法来返回约18,000个实体,大约18mb。
为了使它不仅仅是一个id的集合,我们需要至少添加一些上下文。 Id和Name实体很容易包含,但是其中相关字段可能具有子关系,由于基础数据库设计导致子关系很有趣,使得循环关系变得有趣...
最佳答案
正如您所说的那样,我一直倾向于“全脂” DTO方法。性能是一项功能,降低性能没有比添加大量不必要的网络延迟更好的方法了。
我要说的是,除非您要处理资源严重受限的计算机,否则要全脂处理,这样才能减少往返服务器的往返次数。
您没有提供太多信息,但是我想您在这里得到了数据库表的支持?如果是这样,我更喜欢将“实体”公开为单个数据库记录的纯表示形式(显然省略了敏感字段)。并创建一个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; }
}
在上述设置的基础上,如何通过REST方式公开对象的示例如下:
/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*/
关于c# - 全脂或瘦DTO对象? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46154968/
10-10 17:26