在基于Web的架构中使用POCO、DTO和ViewModel

本文关键字:POCO DTO ViewModel Web | 更新日期: 2023-09-27 18:04:42

在我正在做的一个项目中,我有3层域。

MVC 5 App [Has Reference]->类库[Has Reference]->数据访问层(实体框架)。

  • DAL有POCOs
  • 类库有dto
  • MVC App有ViewModels

例如,我对每个层都有一个非常基本的person类,并且我使用Auto Mapper map,如;

CreateMap<POCO,DTO> //(in class library)
CreateMap<DTO,ViewModel> //(in MVC app)

因为这个person类是非常基本的,所以所有三个层都有几乎相同的类定义。随着项目的发展,越来越多的类开始在所有层上具有相同的结构。我将相同的类定义从一个映射到另一个。

有一些复杂的类在每层上有3个不同的定义是有意义的,但是像"人"类这样的类让我想,在每层上定义相同的类定义是否可以接受。

我知道这个问题看起来像是一个"广泛话题"问题的候选人,但我在网上找不到明确的定义或博客文章。由于书籍大多集中在这些层面中的一个,我找不到一个全面的覆盖。

简单地说,即使对于基本的实体类,在每一层上定义类的好方法是什么?

在基于Web的架构中使用POCO、DTO和ViewModel

在对这个概念进行了更多的研究之后,我发现了之前问过的非常相似的问题:如何减少域/实体/DTO对象的重复?

这个问题给我带来了一篇很棒的文章;http://blog.ploeh.dk/2012/02/09/IsLayeringWorththeMapping/

基本上,如果我想要图层之间的清晰分离,那么这些图层之间的一些复制和映射是我需要付出的代价,没有免费的午餐。

否则,正如@Maris所说,我可以选择创建通用持久性对象的路径,它将在层之间传输,这将减少重复和花费在相关实体类更改上的时间,但是我可能最终在我的类上拥有不相关的属性和属性,以保持对所有层的支持。

因此,我倾向于使用第一个路径。

创建Common项目并将所有公共类移动到该项目的最佳方法是in your case,因此您的三个层中的每一个都可以访问公共类。普通项目不应该知道你的3层。

但我不认为在每层上有不同的viewModel/DTO/poco是最好的方法。

我通常使用下一个架构:

数据访问层(DAL) -有从DB映射的POCOs(同时在DDD的情况下它们是Domain models)

业务层(BL) -使用来自DAL的Domain models

表示层(PL) -从BL获取Domain models,并将它们映射到它们的ViewModels上,并使用ViewModel来表示逻辑。