首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型.NET项目中DTO的管理与映射

大型.NET项目中DTO的管理与映射
EN

Stack Overflow用户
提问于 2011-07-06 18:53:02
回答 3查看 1.2K关注 0票数 8

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

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

管理我们所有的DTO和地图已经成为一个巨大的痛苦。当前,发送要存储在数据库中的联系人如下所示:

  • 地图客户端联系人ContactDTO
  • Map ContactDTO to service Contact
  • Save Contact
  • Map服务联系人ContactDTO
  • Map ContactDTO to client Contact H 210F 211

这感觉糟透了。如果将属性添加到客户端联系人类中,则必须将属性和映射添加到3-4个位置。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-06 23:14:40

我经常遇到这种情况,但在我的例子中,我选择接受它,因为使用DTO的决定是有意的--我希望我的服务、客户端、代理和合同程序集被清晰地分开。

在使用WCF时,我喜欢的布局如下(使用您的联系人示例):

  • 客户端程序集
    • 联系人(有客户端-y
    • )

DTO)

  • 共享合同程序集
    • 联系人(约定的公共
    • )

assembly

  • 代理程序集
    • 使用来自共享契约
      • 的联系人。

Framework)

  • 服务组装
    • 联系人(具有服务-y业务逻辑特性),例如,这可能是实体
    • 之类的ORM层公开的类型。

我现在在服务和客户之间分享合同。如果我需要独立地对它们进行版本化,那么我只需创建共享契约程序集的副本,并重新针对代理程序集使用该副本,然后独立地修改两个合同程序集。但是在我工作过的大多数情况下,我同时拥有客户端和服务,所以在两者之间共享合同组装是很方便的。

这是我在做出将组件与DTO隔离的体系结构决策时所能想到的唯一优化,至少不需要使用代码生成工具(我不知道有什么好的工具,但没有必要对它们进行研究)。

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

票数 2
EN

Stack Overflow用户

发布于 2011-07-06 20:07:26

AutoMapper并不特别复杂。如果您遵循这些约定,例如Contact.Address1成为DTO上的ContactAddress1,那么除了对Mapper.Map的调用之外,您不必编写太多的代码。或者,您可以使用代码生成,但是管理更改仍然很棘手。

我能问你为什么需要同时拥有一个ContactDTO和一个服务联系人吗?你就不能直接把服务联络人传过来吗?我知道这不是最好的实践,但它可能会让你免于RSI。

编辑:忽略我的最后一点--出于某种原因,我认为您是在将服务联系人映射到数据库实体,如NHibernate/Entity

票数 0
EN

Stack Overflow用户

发布于 2011-07-06 23:29:56

有一些事情需要加快进程来考虑:

我编写了一个代码生成器,您可以从数据库中选择表和列,并让它生成一个C# DTO。这样可以节省大量不必要的输入,并且可以更快地生成DTO。先花点时间,但是当你有一个有20个列的表时,你需要映射,这会有所帮助。

我还编写了代码生成器,将DTO映射到存储过程,以便保存、删除和查询操作。同样,这也节省了时间,因为它们中的很多最终都是非常相似的。如果您正在编写大量乏味的“咕噜”代码,请考虑使用代码生成器来完成。

后端使用实体框架或ORM映射器。这可以节省很多时间,但你必须投资于ORM知识,并学习它的工作原理。

创建一组从客户端到数据库的通用DTO。在某些情况下,当客户端需要代理或较小的DTO时,这可能并不实用,但您可以尝试使用一些从客户端一直传递到服务器的通用DTO。

移除一些图层。我知道这听起来有点反模式,但在某些情况下,洋葱不必那么厚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6601483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档