对于列表和详细页面中的同一实体,多个dto?

问题描述:

我正在使用Asp net MVC和EF开发一个站点。 我选择了不带域对象的视图层,所以我创建DTO做到这一点(和Automapper域映射到DTO对象)对于列表和详细页面中的同一实体,多个dto?

我有一个页面课程/列表,列出所有课程。 所以我创建了一个CourseDTO

public class CourseDTO{ 
    public String Id { get; set; } 
    public String Title { get; set; } 
    public String Description { get; set; } 
    public List<ArgumentsDTO> Arguments {get;set;} //NOTE THIS 
} 

public class CourseListViewModel{ 
    public List<CourseDTO> Courses { get; set; } 
} 

课程/详细信息/ 123页我想也显示该课程的教师。

什么是最佳解决方案? 重用CourseDTO并使用一个单独的列表

public class CourseDetailViewModel{ 
    public CourseDTO Course { get; set; } 
    public List<TeacherDTO> Teachers {get;set;} //NOTE THIS 
} 

或创建还含有教师列表中选择一个CourseDetailDTO带来教师到视图列表?

public class CourseDetailDTO{ 
    public String Id { get; set; } 
    public String Title { get; set; } 
    public String Description { get; set; } 
    public List<ArgumentsDTO> Arguments {get;set;} 
    public List<TeacherDTO> Teachers {get;set;} //NOTE THIS 
} 

在最后这种情况下,我将有两个DTO为同一域对象..

这里的问题是,你是否在Detail视图将需要CourseDTO所有属性。如果是这样,那么第一个解决方案看起来不错,重新使用CourseDTO视图模型。另一方面,如果在细节视图中对格式化本课程的某些属性有一些特定要求,则第二种方法也是可以接受的。

我通常对同一个实体使用多个DTO ......但如果有人能证实这确实不是不好的做法,那将是很好的。

我喜欢单独的DTO,因为这意味着可能需要检索更少的数据,从而提高性能。没有必要提供不需要的数据。