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实体很容易包含,但是其中相关字段可能具有子关系,由于基础数据库设计导致子关系很有趣,使得循环关系变得有趣...

最佳答案

正如您所说的那样,我一直倾向于“全脂” 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