.net core 对于非常相似且相互之间存在关系但不完全相同的模型,是否有一个优雅的解决方案?

.net core 对于非常相似且相互之间存在关系但不完全相同的模型,是否有一个优雅的解决方案?,.net-core,.net Core,我最近开始在.NETCore中开发 在开发过程中,我遇到了这样的情况:我必须制作非常相似的模型,但这些模型并不完全相同。例如,让我们讨论一种预订模式: Frontend:这里我需要一个模型,该模型作为JSON发布到我的后端,并与某种FrontendBooking模型相关联 后端:我需要将客户数据添加到预订中,因此我需要根据客户ID添加如下字段:CustomerName和CustomerAddress。后端需要提供这些数据,我不希望前端确定这些字段。我结合这些模型为API调用做准备。一个叫做Req

我最近开始在.NETCore中开发

在开发过程中,我遇到了这样的情况:我必须制作非常相似的模型,但这些模型并不完全相同。例如,让我们讨论一种预订模式:

Frontend:这里我需要一个模型,该模型作为JSON发布到我的后端,并与某种FrontendBooking模型相关联

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

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

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

添加、删除或更改属性时。然后,我必须为每种型号更改它

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

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


提前感谢。

通常,至少在以下级别,您需要不同(尽管相似)的型号:

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

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

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

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

  • API定义(如招摇过市)。服务器DTO和客户端的代码 对象是自动生成的。只要修改一次API定义,双方都可以 获取新对象
  • 也用于数据库的DDD模型。他们 可能故障独立于DTO。映射是为您处理的 半自动,例如Automapper
所说的只是一个建议。所有图层和对象数量都可以而且应该根据项目的特定需要进行调整。例如,如果您没有使用像EF这样的关系映射器,或者不想混合使用DB和logic,则可能需要为数据库使用单独的对象