加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

DDD与Grails

发布时间:2020-12-14 00:50:13 所属栏目:百科 来源:网络整理
导读:我找不到任何有关使用Grails的 Domain Driven Design(DDD)的信息. 我正在寻找任何最佳实践,经验笔记,甚至开源项目,这是使用Grails的DDD的好例子. Grails是在域驱动设计风格中实现应用程序的卓越平台. Grails方法的中心是推动整个开发过程的域类.正如你可能猜
我找不到任何有关使用Grails的 Domain Driven Design(DDD)的信息.

我正在寻找任何最佳实践,经验笔记,甚至开源项目,这是使用Grails的DDD的好例子.

Grails是在域驱动设计风格中实现应用程序的卓越平台. Grails方法的中心是推动整个开发过程的域类.正如你可能猜测的那样,Grails中字域的选择不仅仅是巧合.

您首先定义您的域类,然后您可以使用Grails在提供持久性和生成GUI的过程中全力以赴.值得注意的是,当DDD书被写入之前,就是在Grails或其他类似的框架之前创建的,所以在一本书中处理的很多问题与框架解决或大大减少的问题有关.

Grails解决了一些DDD概念

我将使用DDD pattern summary来处理不同的DDD元素. (下文文字斜体).

域模型

域模型通过域类,服务,存储库和其他DDD模式进行结构化.我们来看看这些细节.

实体

“当一个对象被它的身份而不是它的属性区分开来时,将它作为它在模型中的定义”

这些是Grails中的域类.他们的坚持已经通过GORM解决了.型号可以使用GORM DSL进行微调.看看hasOne vs. belongsTo属性.它可以用于定义实体的生命周期及其关系. belongsTo将导致删除相关实体的级联,而其他将不会.所以,如果你有一个汽车的对象,你可以说汽车“属于”一辆汽车,在这种情况下,汽车是一个聚合根和汽车一个总计.请注意,我在此谈论实体之间的生命周期关系,而不是持久性.

价值对象

“当您只关心模型元素的属性时,将其分类为VALUE对象.使它表达其传达的属性的意义,并给它相关的功能.将VALUE OBJECT视为不可变.不要给它任何身份…“

在Grails中,您可以在GORM字段中使用“embedded”属性来管理值对象.值对象只能通过它所属的实体进行访问,没有自己的ID,并且被映射到与它所属的实体相同的表. Groovy还支持@Immutable注释,但我不知道它如何与Grails一起玩.

服务

“当域中的重要过程或转换不是ENTITY或VALUE OBJECT的自然责任时,将作为声明为SERVICE的独立接口的操作添加到模型中.使服务无状态.

就像实体一样,服务在Grails中是本地支持的.您将Grails服务放在Grails项目的服务目录中.服务随附即开即用:

>依赖注入
>交易支持
>将服务作为Web服务公开的简单机制,以便远程访问它们.

模块

“选择模块,讲述系统的故事,并包含一套凝聚力的概念. “

Grails plug-in机制提供了这一点和更多:一种非常简单的安装和创建插件的方法,定义应用程序如何覆盖插件等.

骨料

“将ENTITIES和VALUE OBJECTS集成到AGGREGATES中,并定义每个对象的边界.选择一个ENTITY作为每个AGGREGATE的根,并通过根控制对边界内对象的所有访问.允许外部对象仅保留对根的引用.

我已经提到了一些生命周期控制机制.您可以使用Grails Services和语言访问控制机制来实施访问控制.您可以使Grails服务扮演DDD Repository的角色,只允许访问Aggregate Root.虽然Grails中的控制器可以直接访问实体的GORM操作,但我认为,为了更好的分层设计,控制器应该注入授权给GORM Active Record操作的服务.

工厂

“将复杂对象和AGGREGATES创建实例的责任转移到一个单独的对象,该对象本身在域模型中本身不负责,但仍然是域设计的一部分.”

Groovy builders是通过丰富的DSL构建复杂对象的绝佳选择.在DDD中,工厂更宽松,不直接转换为GoF抽象工厂或工厂方法. Groovy构建器是GoF Builder模式的DSL实现.

“对于需要全局访问的每种类型的对象,创建一个可以提供该类型的所有对象的内存中集合的错觉的对象.通过众所周知的全局界面设置访问.提供添加和删除对象的方法,这将封装在数据存储中实际插入或删除数据.提供基于某些条件选择对象的方法,并返回完全实例化的对象或属性值符合条件的对象集合,从而封装实际的存储和查询技术.仅为实际需要直接访问的AGGREGATE根提供存储库.让客户关注模型,委托所有对象存储和访问REPOSITORIES.“

Grails服务可用于实现一个专门的Repository对象,只需将其操作委托给Grails GORM即可.坚持用GORM魔法解决.每个Domain类提供了一组解决典型CRUD操作的动态方法,包括查询.

断言

“国家职务的后期条件和类别和集体的不变量.如果ASSERTIONS不能直接用编程语言进行编码,请为其编写自动化单元测试.

>看看Groovy @Invariant,@Requires,@Ensures注释,这些可以用来声明DbC风格的不变量和前后条件
>当您使用Grails命令行创建域类时,将自动创建测试类,这是在您的域中表达断言的另一种机制.

设计声明式

“一个简单的设计可以使客户端代码使用声明式设计.为了说明,下一节将汇集本章中的一些模式,使SPECIFICATION更加柔顺和声明性.

Grails因为Groovy语言和Builder模式的动态性质而支持创建自定义DSLs,这在Grails中处于领先地位.

分层建筑

通过提出的“Convention over Configuration”应用程序结构以分层的基于MVC的实现形式,与Grails“开箱即用”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读