首页 > 解决方案 > 使用数据实体在客户端和微服务之间进行交换 (asp.core)

问题描述

通常我创建 dto 来从微服务(WebApi)获取数据到客户端(MVC)。但是有时将数据实体的结构复制到 dto 是很麻烦的,特别是如果实体有多个字段和许多嵌入关系。所以我必须复制字段和关系。

标签: asp.net-coremicroservices

解决方案


这是一个常见的抱怨,源于不理解有界上下文的概念。因为你深入代码,你只会看到两个看起来一样的东西,并且像所有开发人员一样,你有一个想法,你不应该重复自己(DRY)。

然而,上面的关键词是,这两件事看起来是一样的。它们实际上并不相同,这是关键的重点。它们是来自不同上下文(例如数据存储和应用层)的域对象的表示。如果您使用相同的对象,您会将这些上下文紧密耦合到它们现在不可分割的地步。因此,具有多层的概念变得毫无意义。

这里的一个相关概念是反腐败层。这是您添加到应用程序中的一层,以促进两个不同应用程序上下文或域之间的通信。API 是一种反腐败层。同样,因为您正在构建所有应用程序,所以它们看起来都是一样的。但是,将您的 MVC 应用程序想象成由其他人构建以使用您的 API 的第三方应用程序。他们是否应该使用您的直接实体?不,他们可能会有自己的实体类和自己的数据存储。您的 API 使用的 DTO 为这两个不同的应用程序提供了一种通过通用语言进行通信的方式。如果您直接使用实体类,那么对数据的任何更改都需要更改 API,这反过来又需要更改 API 的任何使用者。想象一下,如果 Google 更改了数据库列,并且正因为如此,每个使用其 API 的开发人员都必须立即对自己的应用程序进行更改,否则它们会崩溃。

简而言之,仅仅因为两个类看起来相同,并不意味着它们相同的。您的实体和您的 DTO 都是不同上下文中的概念的表示,因此您需要并且应该同时拥有两者。


推荐阅读