【发布时间】:2015-01-11 08:56:20
【问题描述】:
如何在 Grails 中拆分域逻辑和数据访问(这是个好主意)?
我们编写的许多软件应用程序都以数据(基础)为中心,并且在 Grails 中,通常会从服务类或控制器直接保存到 DataSource.groovy 中配置的数据库中。更改数据库很容易,但我们并不是真正独立于代码中的持久化实现。
我正在尝试编写一个为不同的持久性和数据源(不仅是数据库)实现打开的应用程序,并专注于业务领域而不是数据库实体。这也是测试时的一个加分项(易于编写 fake/mock 持久性) 最初我只有一个持久性实现——Grails 域类,使用 GORM。但有可能我将来希望拥有数据库以外的其他数据源,例如休息服务或其他东西。
目前,我只将数据库作为数据源,并且主要做一些杂乱无章的事情(以及一些领域逻辑)。我认为我仍然停留在“旧”思维中,专注于数据库持久性,因为我的大多数业务域类都有一个 Grails 域类等价物,它是它的副本。当要持久化域类时,我只需将属性复制到 Grails 域类。
我对这个解决方案不太满意。我能想到至少两个可能的改进/更改:
- 我的 Grails 域类的组织方式可能与业务域类不同,因此我不只是将属性从一个类复制到另一个类。但是,在从数据库读取或写入数据库时,这仍然会涉及从一个类到另一个类的大量属性映射。
- 也许有一种方法可以使用业务领域类,从常规的 src/main/groovy 包中使用 GORM 东西进行装饰?或者以其他方式拆分域逻辑和持久性?我已经看到可以通过在域类上使用 hibernate conf 来做到这一点。这是唯一的方法吗?
我看到了一些关于 Grails 架构的有趣讨论,包括干净的架构、六边形架构和 ddd,但我还没有找到任何示例。有吗?
在这一点上,正如我所说,大部分功能都是 CRUD 的东西,但不是全部。而且,应用程序可能有更多的业务逻辑,所以我不希望使用带有视图、控制器、服务、域的 Grails 的“默认”架构。我想要一个独立于 grails 视图/控制器和域/GORM 的“核心”应用程序
【问题讨论】:
-
也许我可以使用基类并在 Grails 域文件夹和业务域文件夹中扩展它...
-
GORM 本身非常“可插拔”,并且您可能知道,许多支持实现已经存在:Mongo、Hibernate、Neo4j、Redis 等(看看github.com/grails/grails-data-mapping)只要当您避开 HQL 和原生 SQL(更喜欢动态查找器和 where 查询)时,可以在实现之间移动而无需大量代码更改。
-
感谢您的回复@Andrew。是的,GORM 是可插拔的,但如果可能的话,我试图独立于数据库作为持久性。所以它应该是一个可以是任何东西的存储库(即模拟、文件系统等)。也许我的数据库模型根本不应该看起来像业务领域。至少我必须考虑到这一点。
-
对,还有一些额外的想法:1) 看看grails.org/plugin/gorm-rest-client,这是 GORM 极端灵活性的一个例子,2) 命令对象是一个强大的概念,可能有助于您的工作,请参阅例如:skillsmatter.com/podcast/groovy-grails/…
-
我会@Andrew。欣赏它!谢谢。
标签: grails dns domain-driven-design persistence hexagonal-architecture