我最近开始在.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和逻辑,那么您可能希望为数据库使用单独的对象。