首页 > 解决方案 > 对于非常相似并且彼此之间确实存在关系但不完全相同的模型,是否有一个优雅的解决方案?

问题描述

我最近开始在 .NET 核心中进行开发。

在开发过程中,我遇到了必须制作非常相似但又不太一样的模型的情况。例如,让我们谈谈预订模型:

前端:在这里,我需要一个模型,它以 JSON 格式发布到我的后端,并被反序列化为一种 FrontendBooking 模型。

后端:我需要将客户数据添加到预订中,因此我需要根据其 CustomerId 添加如下字段:CustomerName 和 CustomerAddress。后端需要提供这些数据,我不希望前端确定这些字段。我将这些模型结合起来,为 API 调用做准备。到一个名为 RequestBooking 的模型。

API:我将 RequestBooking 发送到 API,并获得了一个带有类似对象的响应,该对象添加了例如 Status 和 BookingId,这是由 API 添加到模型中的。所以我需要将其反序列化为一个名为:ResponseBooking 的对象。

数据库:最后我希望将对象存储到数据库中,但并非模型的所有属性都是相关的,因此我创建了另一个名为:DatabaseBooking 的模型并将其存储到数据库中。

添加、删除或更改属性时。然后我将不得不为这些模型中的每一个进行更改。

是否有设计模式或其他解决方案,所以这更易于管理?

另外,命名这些模型的最佳实践是什么?将它们全部命名为 Booking 感觉不太正确,添加它们的用途也感觉不太正确。

提前致谢。

标签: .net-core

解决方案


好吧,一般来说,至少在这些级别上,您将需要不同(尽管相似)的模型:

服务器:在这里您可以使用域驱动设计。您将有一个对象 Booking 负责其逻辑并包含所有属性和方法,例如MarkAsCancelled。您可以使用实体框架在数据库中使用相同的对象,该对象将对应一个数据库表。EF 允许您将某些属性标记为未保存在数据库中。您还可以在 DbContext 类中设置 EF,因此不在类中使用 DB 特定属性。所以数据库和后端业务逻辑的一个对象。

API:显然你不能将你的域对象发送到 API,例如 REST。在 API 中,您可能想要组合多个域对象的属性或隐藏某些属性。您必须定义一组数据传输对象 (DTO),例如 BookingDto。如何将您的域对象转换为 DTO?AutoMapper 之类的解决方案可能会有所帮助。您只需设置一次转换规则。

现在您可以在例如 Swagger 中描述您的 API。使用 Swagger Codegen,您可以为您的服务器(.net)和客户端(例如 JS)生成代码。

最后,您将必须支持以下内容:

  • API 定义(例如 Swagger)。服务器 DTO 和客户端对象的代码是自动生成的。您修改一次 API 定义,双方都会得到新的对象。
  • 也用于数据库的 DDD 模型。它们可能与您的 DTO 无关。映射由例如 Automapper 半自动地为您处理

所有说的只是一个建议。所有层和对象的数量都可以而且应该适应您项目的特定需求。例如,如果您不使用像 EF 这样的关系映射器或者不想混合 DB 和逻辑,您可能希望为数据库使用单独的对象。


推荐阅读