我正在寻找任何最佳实践,经验笔记,甚至开源项目,这是使用Grails的DDD的好例子.
您首先定义您的域类,然后您可以使用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“开箱即用”.