在大型.NET项目中管理DTO和映射

Tay*_*ell 8 .net mapping dto

我和我的团队正在构建一个大型的.NET WinForms应用程序.该应用程序使用各种"服务"来从我们的数据库中获取数据.每个"服务"都存在于自己的解决方案中,并处理特定类型的数据.因此,例如,我们的"ContactsService"管理检索/保存联系人到我们的数据库.

通常,我们一直在为每项服务构建DTO.因此,我们可能会有一个"ContactDTO",它对联系人的每个数据都有简单的字符串属性.现在,我们还有一个业务层"Contact"类,它具有完全相同的属性,可能还有一些带有一些业务逻辑的额外方法.最重要的是,"ContactsService"有自己的Contact类,它来自ContactDTO.

管理我们所有的DTO和映射已经变得非常痛苦.目前,发送要存储在数据库中的联系人如下所示:

  • 地图客户端联系ContactDTO
  • 将ContactDTO映射到服务联系人
  • 保存联系人
  • 地图服务联系ContactDTO
  • 将ContactDTO映射到客户联系人

这只是感觉很糟糕.如果我们向客户端Contact类添加一个属性,我们必须在3-4个地方添加属性和映射.

我们做错了什么,我们怎样才能让生活更轻松?使用像Json.NET这样的东西并拥有JSON DTO会更简单吗?我们检查了AutoMapper,但是一些团队成员认为它太复杂了.

Lar*_*ann 3

我已经遇到过很多次这种情况,但就我而言,我选择接受它,因为使用 DTO 的决定是有意的 - 我希望我的服务、客户端、代理和合约程序集能够完全分离。

使用 WCF 时,我更喜欢的布局是这样的(使用您的联系人示例):

  • 客户端组装
    • 联系方式(具有客户特征)
  • 共享合约组装
    • 联系方式(商定的通用 DTO)
  • 代理组装
    • 使用共享合同程序集中的联系人
  • 服务组装
    • 联系人(具有服务业务逻辑特征,例如,这可能是由 ORM 层(如实体框架)公开的类型)

我现在正在共享服务和客户端之间的合同。如果我需要独立对它们进行版本控制,那么我只需制作共享 Contracts 程序集的副本并重新定位 Proxy 程序集以使用该副本,然后独立修改两个 Contracts 程序集。但在我工作过的大多数情况下,我同时拥有客户端和服务,因此在两者之间共享 Contracts 程序集很方便。

当您做出用 DTO 隔离组件的架构决策时,这是我能想到的唯一优化,至少不使用代码生成工具(我不知道有什么好的优化,但不必研究它们) 。

编辑:当不使用 WCF 时,您显然不需要“代理”程序集。