对于非常相似、彼此之间确实有关系但不完全相同的模型,有没有一个优雅的解决方案



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

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

Frontend:在这里,我需要一个模型,它以JSON的形式发布到我的后端,并被取消为一种FrontendBooking模型。

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

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

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

添加、删除或更改特性时。然后,我将不得不为每种型号更改它。

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

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

提前谢谢。

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

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

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

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

最终,您将不得不支持以下内容:

  • API定义(例如Swagger(。服务器DTO和客户端的代码对象是自动生成的。修改API定义一次,两边都修改获取新对象
  • 也用于数据库的DDD模型。他们可能无法独立于您的DTO。为您处理映射半自动,例如Automapper

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

相关内容

  • 没有找到相关文章