Java CRUD体系结构设计-反序列化
我有一个Java应用程序来对产品对象执行CRUD操作。 架构是: ProductRepository->数据库通信 ProductService->业务逻辑 ProductController->API路由 ProductDeserializer->从API对象创建新产品 ProductSerializer->从产品创建API对象 产品流的创建过程如下: API->ProductController->ProductDeserializer->ProductService->ProductRepository 在ProductService中创建的方法如下所示: (一) 问题是:这样做是否更简单、更好: (二) 理由1):Java CRUD体系结构设计-反序列化,java,serialization,architecture,Java,Serialization,Architecture,我有一个Java应用程序来对产品对象执行CRUD操作。 架构是: ProductRepository->数据库通信 ProductService->业务逻辑 ProductController->API路由 ProductDeserializer->从API对象创建新产品 ProductSerializer->从产品创建API对象 产品流的创建过程如下: API->ProductController->ProductDeserializer->ProductService->ProductRep
- 创建产品是服务的责任,而不是反序列化程序
- 责任是共享的,反序列化器确保格式,服务添加业务逻辑和验证
- 一家汽车制造厂被赋予组装零件的权利,它是否会重建和重新组装所有零件?不,它只是验证和组装它们
这个例子被简化了,但是如果我必须为产品开发复制功能,那么编码和维护将需要一些时间,而且似乎要重复反序列化程序中完成的工作。如果您只是制作同一产品的另一个副本,我看不出创建一个单独的副本然后保存该副本会有什么用处/好处。验证本身应该很好,因此#2看起来不错
我认为执行#1的唯一原因是当您有不同的服务对象,并且在保存之前以某种方式对其进行处理(可能是基于呼叫者是移动设备而不是桌面浏览器等)。在这种情况下,反序列化的产品将不同于保存的产品,您可能需要进行复制。我不认为这是1的理由。这是有效的。服务没有责任创建产品,API的客户端已经创建了,服务有责任验证和保存(通过存储库)产品。另外,反序列化程序不应该得到太多的关注,因为它只用于方便地处理数据。我已经想到了API客户端的责任,但忘了提到它,谢谢@ÁkosRatkuYou是对的@Guanxi,这比我第一次说的要复杂。我编辑了问题,并添加了产品品牌的loadBrand作为示例。该品牌必须重新加载。对于一个新的新产品拷贝,只需执行loadBrand就足够了,但是如果我们重用反序列化对象,我们需要进行一些清理。
public Product create(Product product) {
validateInput(product);
Product newProduct = new Product();
copy(product, newProduct);
loadBrand(newProduct);
return productRepository.save(newProduct);
}
public Product create(Product product) {
validateInput(product);
cleanupBrand(product);
loadBrand(product);
return productRepository.save(product);
}