首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Grails中拆分域逻辑和数据访问

如何在Grails中拆分域逻辑和数据访问
EN

Stack Overflow用户
提问于 2015-01-11 00:56:20
回答 1查看 934关注 0票数 0

如何在Grails中拆分域逻辑和数据访问(这是一个好主意)?

我们编写的许多软件应用程序都是以数据(基)为中心的,在Grails中,经常会从服务类或控制器直接持久化到DataSource.groovy中配置的数据库。更改数据库很容易,但我们并不完全独立于代码中的持久性实现。

我试图编写一个为不同的持久性和数据源(不仅仅是数据库)实现打开的应用程序,并将重点放在业务域而不是数据库实体上。在测试时(容易编写假/模拟持久性),这也是一个好处--最初我只有一个持久性实现--使用GORM的Grails域类。但是,将来我可能希望拥有数据库以外的其他数据源,例如rest服务或其他什么。

目前,我只将数据库作为数据源,并且主要做crud操作(以及一些域逻辑)。我认为我仍然停留在“旧”思维中,专注于数据库持久性,因为我的大部分业务域类都有一个Grails域类,即它的副本。当要持久化域类时,我只需将属性复制到Grails域类。

我对这个解决办法不太满意。我至少可以想到两种可能的改进/改变:

  1. 我的Grails域类可以与业务域类更不同的组织方式,所以我不只是将属性从一个类复制到另一个类。不过,在从/写入数据库时,这仍然需要从一个类到另一个类的大量属性映射。
  2. 也许有一种方法可以使用业务域类,从常规的src/main/groovy包中使用GORM之类的东西来装饰?还是以其他方式分割域逻辑和持久化?我已经看到,通过在域类上使用hibernate conf是可以做到这一点的。这是唯一的办法吗?

我看到了一些关于Grails体系结构的有趣的讨论,包括干净的体系结构、六边形的体系结构和ddd,但是我还没有找到任何例子。有吗?

在这一点上,正如我所说的,大部分功能都是CRUD功能,但不是所有功能。而且,应用程序可能具有更多的业务逻辑,因此我不希望使用带有视图、控制器、服务、域的Grails“默认”体系结构。我需要一个“核心”应用程序,它在某种程度上独立于grails视图/控制器和域/GORM。

EN

回答 1

Stack Overflow用户

发布于 2015-06-14 03:36:02

你写问题已经有一段时间了,但这对我来说是个很有趣的话题.

我目前在大型Java8项目中工作,这些项目实现清洁架构、ddd、cqr和六角形体系结构等原则。我在Grails1.x项目方面的经验也很有限,我记得我问过的问题和你现在一样。

现在我有了更广阔的视角,我真诚地认为,强迫Grails进入一个干净的体系结构是没有意义的。你会有一个非常痛苦的时间,试图实现它,你可能会不满意的结果。

Grails中的所有东西都被设计成以一种固执己见、基于约定的方式使用。从GORM是一个ActiveRecord实现开始,然后是他们就目录结构、您需要定义的工件(控制器、服务、模型.)的语义所做的每一个小小的决定。我不是说这很糟糕。事实上,当您正在开发适合于这种事物模式的东西时,这是很棒的。

工件之间的这种耦合和隐式行为使得除了数据访问(或http交互,或与第三方的任何其他交互)之外,很难建模您的业务逻辑。

从DDD的角度来看,您应该倾向于数据或基于集合的存储库,而不是ActiveRecord实现。然后,您可以开始将持久化逻辑与域模型分离。尝试这样做,同时保持ActiveRecord与持久化层的交互,将会产生一个非常“脏”的适应性层,并且会有大量的重复。

您将遇到一段非常困难的时间,特别是在尝试使用聚合对象来调整复杂域时,例如,这些对象应该进入不同的数据库表。

现在,针对您建议的两个改进,我可以告诉您:

  1. 我的Grails域类可以与业务域类更不同的组织方式,所以我不只是将属性从一个类复制到另一个类。不过,在从/写入数据库时,这仍然需要从一个类到另一个类的大量属性映射。

你真的可以按你说的做。只需在src/groovy文件夹中放置一些代码即可。这里您将面临的主要问题是依赖注入。Grails在标准目录中定义服务和控制器时自动注入它们的依赖项。对于其他方面,您需要显式地进行告诉Grails如何获取依赖项并将它们传递给您的自定义工件。

  1. 也许有一种方法可以使用业务域类,从常规的src/main/groovy包中使用GORM之类的东西来装饰?还是以其他方式分割域逻辑和持久化?我已经看到,通过在域类上使用hibernate conf是可以做到这一点的。这是唯一的办法吗?

如果您用GORM装饰在src/groovy中定义的域对象(如果可能的话),您将遇到同样的问题。这里的任务是将您的域与持久性逻辑隔离开来。这样做的方式是让任何一个戈姆都没有达到它的目的。

我在这里的建议是:

  1. 切换到其他不太耦合的库,这些库允许您设计自己的体系结构(即大鼠约克)或
  2. 如果这不是一种选择,那就完全拥抱圣杯式的事情吧。

有一个非常全面的库列表,您可以浏览它以获得灵感:超赞Java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27885441

复制
相关文章
如何在SpringBoot应用中实现跨域访问资源和消息通信?
CORS ( Cross Origin Resource Sharing,跨域资源共享)机制允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。浏览器支持在API容器中(如XMLHttpRequest或Fetch )使用CORS,以降低跨域HTTP请求所带来的风险。
愿天堂没有BUG
2022/10/28
1.6K0
如何在SpringBoot应用中实现跨域访问资源和消息通信?
IE中iframe跨域访问
本文主要讲述了IE浏览器中iframe跨域访问的问题以及如何解决。主要包括三个方面:1.什么是跨域,以及跨域引发的问题;2.如何解决跨域问题,分别从浏览器和服务器两个方面给出方案;3.浏览器和服务器在解决跨域问题的过程中需要注意的一些细节。
高爽
2017/12/28
4.3K0
IE中iframe跨域访问
如何在 Ubuntu 中管理和使用逻辑卷管理 LVM
在我们之前的文章中,我们介绍了什么是 LVM 以及能用 LVM 做什么,今天我们会给你介绍一些 LVM 的主要管理工具,使得你在设置和扩展安装时更游刃有余。
用户8705036
2021/06/08
5.1K0
跨域与跨域访问_如何实现跨域访问
跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域
全栈程序员站长
2022/11/10
5.5K0
在 Eclipse 中配置 Grails 工程
配置 GRAILS_HOME,注意一定要配置到 build.xml 所在的文件夹:
四火
2022/07/15
1.1K0
在 Eclipse 中配置 Grails 工程
数据库表的垂直拆分和水平拆分
水平拆分是指数据表行的拆分,表的行数超过 200 万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。
七点一刻
2023/03/09
2.1K0
数据库表的垂直拆分和水平拆分
nginx跨域访问配置_cors跨域访问不了
跨域概念 简单来说:两个url只要协议、域名、端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题。
全栈程序员站长
2022/11/15
4.6K0
nginx跨域访问配置_cors跨域访问不了
跨域与跨域访问
什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域 为什么浏览器要限制跨域访问呢? 原因就是安全问题:如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题。比如下面的操作就有安全问题: 用户访问www.mybank.com ,登陆并进行网银操作,这时cookie啥的都生成并存放在浏览器 用户突然想
MonroeCode
2018/02/09
5.3K0
SpringMvc支持跨域访问,Spring跨域访问@CrossOrigin
跨域,即跨站HTTP请求(Cross-site HTTP request),指发起请求的资源所在域不同于请求指向资源所在域的HTTP请求。
三哥
2018/09/20
3K0
nginx配置跨域访问,无法生效_页面跨域访问
由于浏览器同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制。即会出现跨域请求禁止。
全栈程序员站长
2022/11/10
7.7K0
如何在CVM实例中访问对象存储
对象存储服务与客户的VPC打通,需要客户先确认在哪个子网中使用。由腾讯云工程师进行网络配置,会在客户指定的子网中配置一个vip并与对象存储打通并映射。
本地专用集群CDC
2023/04/21
3.4K0
在Excel中处理和使用地理空间数据(如POI数据)
因为不是所有规划相关人员,都熟悉GIS软件,或者有必要熟悉GIS软件,所以可能我们得寻求另一种方法,去简单地、快速地处理和使用地理空间数据——所幸,我们可以通过Excel自带的“三维地图”功能来简单满足一些差不多够用的需求。
Sidchen
2020/08/02
11K0
cytof数据拆分
如果你确实纠结于cytof数据处理的软件和工具的选择,也可以看2019的文章,Liu et al. Genome Biology,标题是;《A comparison framework and guideline of clustering methods for mass cytometry data》,在6个数据集上面,测试了9种算法的表现。
生信技能树
2022/03/03
1.2K0
cytof数据拆分
Openresty 配置访问静态文件,拆分路径
那么如果,我想要根据前面的路径再拆分一下请求呢? 例如:我有另一个工作目录/work/moniter-web/web/redis,需要访问另一个子路径url(/redis/index.html)命中这个工作目录下的index.html ,那么该怎么配置呢?
Devops海洋的渔夫
2019/05/31
2.5K0
解决cookie跨域访问_cookie 跨域
在此之前一直以为传统的服务器使用session保存用户信息的方案在前后端分离时不能使用,无法获取请求的状态。 后面经过了解发现http本身就是无状态的,传统的session保存法也是因为服务端生成一个id返回给客户端保存在cookie中,客户端请求数据时将其通过请求头发给服务端,服务端再通过id找到具体数据即可。因此再跨域时只需能操作cookie就可以使用session了。恰好XMLHttpRequest对象提供了跨域接口withCredentials:跨域请求是否提供凭据信息(cookie、HTTP认证及客户端SSL证明等)。
全栈程序员站长
2022/11/10
3.6K0
如何在Vue组件中访问Vuex store中的状态?
在Vue组件中访问Vuex store中的状态,可以通过计算属性 (computed properties) 或者直接通过$store.state来实现。
王小婷
2023/10/02
3900
使用 DDD 指导微服务拆分的逻辑
对于服务拆分的逻辑来说,是先设计高内聚低耦合的领域模型,再实现相应的分布式系统。服务的划分有一些基本的方法和原则,通过这些方法能让微服务划分更有操作性。最终在微服务落地实施时也能按图索骥,无论是对遗留系统改造还是全新系统的架构都能游刃有余。
ThoughtWorks
2020/12/22
6540
使用 DDD 指导微服务拆分的逻辑
JavaScript中的作用域和作用域链
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。可能这两句话并不好理解,我们先来看个例子:
刘亦枫
2020/03/19
2.2K0
JavaScript中的作用域和作用域链
点击加载更多

相似问题

Grails域:如何访问父域数据?

211

Grails,如何在域类中访问当前?lang

21

grails - afterDelete()访问域属性

11

grails动态访问域对象

20

如何在GRAILS中访问src/java中的域类?

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文