【问题标题】:Using POCO, DTO and ViewModel on Web Based Architecture在基于 Web 的架构上使用 POCO、DTO 和 ViewModel
【发布时间】:2015-10-17 03:38:22
【问题描述】:

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

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

  • DAL 有 POCO
  • 类库有 DTO
  • MVC 应用有 ViewModels

例如,我为每个图层都有一个非常基本的人物类,并且我正在使用 Auto Mapper 地图之类的;

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

由于这个person类是非常基础的,所有三层都有几乎相同的类定义。随着我的项目的增长,开始有更多的类在所有层上都具有相同的结构。我正在将相同的类定义从一个映射到另一个。

有一些复杂的类在每一层上有 3 个不同的定义是有意义的,但是如果这是在每一层上定义相同类定义的一种可接受的方法,那么像“人”类这样的类会让我觉得很重要。

我知道这个问题看起来像是一个“广泛主题”问题的候选者,但我在网上找不到明确的定义或博客文章。由于书籍主要集中在其中一个层面,因此我无法找到关于这方面的全面报道。

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

【问题讨论】:

  • 如果他们真的是 POCO,那么是的完全是一个视图模型,因为您需要的一切都已经在模型上,或者您有一些不应该分享给业务逻辑的额外信息 - 但是是的这似乎非常基于意见我>

标签: c# asp.net-mvc viewmodel poco dto


【解决方案1】:

在对这个概念进行了更多研究后,我发现之前提出的问题非常相似: How do I reduce duplication of domain/entity/DTO objects?

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

基本上,如果我想要层之间的清晰分离,它们之间的一些重复和映射是我需要付出的代价,没有免费的午餐这样的东西。

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

因此,我倾向于选择第一条路径。

【讨论】:

    【解决方案2】:

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

    但我不认为在每一层上使用不同的 viewModel/DTO/POCO 是最好的方法。

    我通常使用下一个架构:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2021-01-21
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多