【问题标题】:CRUD Architecture design - deserializationCRUD架构设计——反序列化
【发布时间】:2015-09-16 01:05:15
【问题描述】:

我有一个 Java 应用程序来对 Product 对象执行 CRUD 操作。 架构是:

ProductRepository -> 数据库通信

ProductService -> 业务逻辑

ProductController -> API 路由

ProductDeserializer -> 从 API 对象创建新产品

ProductSerializer -> 从 Product 创建 API 对象

产品流程的创建过程:

API -> ProductController -> ProductDeserializer -> ProductService -> ProductRepository

ProductService 中的 create 方法如下:

1)

public Product create(Product product) {
   validateInput(product);
   Product newProduct = new Product();
   copy(product, newProduct);
   loadBrand(newProduct);
   return productRepository.save(newProduct);
}

问题是:这样做是否更简单更好:

2)

public Product create(Product product) {
   validateInput(product);
   cleanupBrand(product);
   loadBrand(product);
   return productRepository.save(product);
}

1) 的参数:

  • 服务负责创建产品,而不是反序列化程序

2) 的论据:

  • 职责分担,Deserializer 确保格式,Service 添加业务逻辑和验证。
  • 获得零件组装的汽车厂是否会重建和改造所有零件?不,它只是验证它们并组装它们。

这个例子被简化了,但是如果我必须为产品开发复制功能,它需要一些时间来编码和维护,并且似乎重复了在反序列化器中完成的工作。

【问题讨论】:

  • 我不认为 1. 的论点是有效的。服务不负责创建产品,您的 API 的客户端已经这样做了,服务有责任验证和保存(通过存储库)产品。此外,反序列化器不应该受到太多关注,因为它只是用于方便地处理数据。
  • 我想到了API客户端的责任,忘了说,谢谢@ÁkosRatku

标签: java serialization architecture


【解决方案1】:

如果您只是制作 SAME Product 的另一个副本,我看不出通过创建一个单独的副本然后保存该副本可以获得任何用途/优势。验证本身应该没问题,所以 #2 看起来不错。

我看到做 #1 的唯一原因是当您有不同的服务对象并且在保存之前以某种方式进行处理(可能基于调用者是移动设备与桌面浏览器等)。在这种情况下,被脱轨的产品与获得保存的产品不同,您可能想要复制。

【讨论】:

  • 你说得对@Guanxi,这比我第一次说的要复杂。我编辑了问题并添加了产品品牌的示例 loadBrand。品牌必须重新加载。如果是新的 Product 副本,执行 loadBrand 就足够了,但如果我们重用反序列化的对象,我们需要进行一些清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
相关资源
最近更新 更多