0

我的应用程序有大约 50 个实体,它们在 UI 中以网格格式显示。所有 50 个实体都有 CRUD 操作。大部分操作都有标准流程

IE。对于获取,从存储库中读取实体,转换为 DTO 并返回 DTO 的列表。用于创建/更新/删除 - 获取 DTO - 转换为实体,使用存储库在数据库上创建/更新/删除,返回更新的 DTO

请注意,对于某些实体,还有一些特定于实体的操作必须完成。

目前,我们对所有实体都有一个 get/create/update/delete 方法,例如 getProducts createProducts updateProducts getCustomers createCustomers updateCustomers 在每个方法中,我们使用 Product/Customer 存储库在从实体转换后执行 CRUD 操作 -> dto 和反之亦然。

我觉得有很多代码重复,必须有一种方法可以删除这么多这些方法。

我可以使用一些模式(命令模式)来摆脱代码重复吗?

4

2 回答 2

0

查看Spring Data JPA此处的项目。它取消了 DAO 的样板代码。

我相信它基本上使用 AOP 来解释调用,例如

findByNameandpassword (String name,String passwd) 

根据在选择方法名称中的字段时传递的参数进行查询(仅一个接口)。

作为一个 Spring 项目,它对 Spring 库的要求非常低。

于 2013-09-30T07:52:14.527 回答
0

基本上,您有两种方法可以做到这一点。

第一种方式:代码生成

编写一个可以在给定数据库模式的情况下生成代码的类。请注意,您将为每个实体创建基本类。如果您有自定义代码(特定于某些实体的代码),您可以将其放在子类中,以便在重新生成基本类时它不会被覆盖。

对象实例化应该通过工厂方法,以便使用正确的子类。

确保在生成的代码中添加注释,明确说明代码是自动生成的(这样人们就不会直接开始编辑它们)。

第二种方式:反射

这种解决方案虽然更优雅,但也更复杂。您拥有一个可以处理任何实体的基本类,而不是为每个实体生成一个基本类。该类将使用反射来访问 DTO:s。

如果您有自定义代码(特定于某些实体的代码),您可以将其放在其他类中。这些其他类将被注入到泛型类中。

使用反射需要对您的 DTO:s 进行严格的命名策略。

结论

我一直在一个项目中使用迁移项目中的第一种方法为新应用程序服务器(运行 java)和胖客户端之间的服务接口生成 DTO 类,并且效果很好。我们有超过 100 个生成的 DTO 类。我知道您正在尝试的内容略有不同。编辑数据库记录是一个普遍的问题(所有项目都需要它),但没有(m)任何框架。

我一直在考虑为它创建一个通用工具或框架,但我从来没有考虑过。

于 2013-09-30T08:39:25.753 回答