.net-core - 对于非常相似并且彼此之间确实存在关系但不完全相同的模型,是否有一个优雅的解决方案?
问题描述
我最近开始在 .NET 核心中进行开发。
在开发过程中,我遇到了必须制作非常相似但又不太一样的模型的情况。例如,让我们谈谈预订模型:
前端:在这里,我需要一个模型,它以 JSON 格式发布到我的后端,并被反序列化为一种 FrontendBooking 模型。
后端:我需要将客户数据添加到预订中,因此我需要根据其 CustomerId 添加如下字段:CustomerName 和 CustomerAddress。后端需要提供这些数据,我不希望前端确定这些字段。我将这些模型结合起来,为 API 调用做准备。到一个名为 RequestBooking 的模型。
API:我将 RequestBooking 发送到 API,并获得了一个带有类似对象的响应,该对象添加了例如 Status 和 BookingId,这是由 API 添加到模型中的。所以我需要将其反序列化为一个名为:ResponseBooking 的对象。
数据库:最后我希望将对象存储到数据库中,但并非模型的所有属性都是相关的,因此我创建了另一个名为:DatabaseBooking 的模型并将其存储到数据库中。
添加、删除或更改属性时。然后我将不得不为这些模型中的每一个进行更改。
是否有设计模式或其他解决方案,所以这更易于管理?
另外,命名这些模型的最佳实践是什么?将它们全部命名为 Booking 感觉不太正确,添加它们的用途也感觉不太正确。
提前致谢。
解决方案
好吧,一般来说,至少在这些级别上,您将需要不同(尽管相似)的模型:
服务器:在这里您可以使用域驱动设计。您将有一个对象 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 和逻辑,您可能希望为数据库使用单独的对象。
推荐阅读
- python - 如何解决此弃用警告
- c# - 如何将锁系统状态添加到我的 SaveState 类?
- arrays - 如何将对象传递给一个方法,然后再传递给另一个方法
- three.js - 如何将旧的演示升级到最新版本的three.js?
- regex - 不允许 XSD 正则表达式中的特定字符串
- php - 消息:尝试访问 null 类型值的数组偏移量
- javascript - ES6 将两个变量组合成一个现有的 javaScript 对象
- python - 读取 .txt 并用逗号分割列表时出错
- javascript - Chrome 插件随机向我的 C++ 本地主机应用程序发送垃圾
- c# - 单击上传按钮时我无法显示文件路径