gpt4 book ai didi

grails - 带 Grails 的 DDD

转载 作者:行者123 更新时间:2023-12-03 21:04:27 29 4
gpt4 key购买 nike

我找不到任何关于做 Domain Driven Design 的信息(DDD) 与 Grails。

我正在寻找任何最佳实践、经验笔记甚至开源项目,这些项目都是使用 Grails 进行 DDD 的良好示例。

最佳答案

Grails 是 卓越以领域驱动设计风格实现应用程序的平台。 Grails 方法的核心是驱动整个开发过程的域类。正如您可能已经猜到的那样,Grails 中词域的选择不仅仅是巧合。

您首先定义域类,然后您可以使用 Grails 完成所有繁重的工作,以提供持久性和生成 GUI。值得注意的是,DDD这本书写的时候,是在Grails或其他类似框架创建之前,所以书中处理的很多问题都与框架解决或大大减少的问题有关。

Grails 解决的一些 DDD 概念

我会用 DDD pattern summary解决不同的 DDD 元素。 (引号在下面的文本中用斜体表示)。

领域模型

域模型是通过域类、服务、存储库和其他 DDD 模式构建的。让我们详细看看这些。

实体

“当一个对象通过它的身份而不是它的属性来区分时,把它作为它在模型中的定义的主要内容”

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

值对象

“当您只关心模型元素的属性时,请将其归类为 VALUE OBJECT。让它表达它所传达的属性的含义,并赋予它相关的功能。将 VALUE OBJECT 视为不可变的。不要给它任何身份……”

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

服务

“当域中的重要过程或转换不是实体或值对象的自然责任时,将操作作为声明为服务的独立接口(interface)添加到模型中。使 SERVICE 无状态。”

就像实体一样,Grails 原生支持服务。您将 Grails 服务放在 Grails 项目的 services 目录中。服务带有以下开箱即用的功能:

  • 依赖注入(inject)
  • 交易支持
  • 一种将服务公开为 Web 服务的简单机制,以便可以远程访问它们。

  • 模块

    “选择讲述系统故事并包含一组有凝聚力的概念的模块。 “

    chalice plug-in机制提供了这个以及更多:安装和创建插件的非常简单的方法,定义应用程序如何覆盖插件等。

    聚合体

    “将实体和值对象聚集到聚合中并定义每个对象的边界。选择一个 ENTITY 作为每个 AGGREGATE 的根,并通过根控制对边界内对象的所有访问。允许外部对象仅保存对根的引用。”

    我已经提到了一些生命周期控制机制。您可以使用 Grails 服务和语言访问控制机制来实现访问控制。您可以让 Grails 服务扮演 DDD 存储库的角色,该服务仅允许访问聚合根。虽然 Grails 中的 Controller 可以直接访问实体上的 GORM 操作,但我认为为了更好的分层设计, Controller 应该注入(inject)委托(delegate)给 GORM Active Record 操作的服务。

    工厂

    “将创建复杂对象和 AGGREGATES 实例的责任转移到一个单独的对象,它本身可能在域模型中没有责任,但仍然是域设计的一部分。”

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

    存储库

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

    Grails 服务可用于实现专用的 Repository 对象,该对象只是将其操作委托(delegate)给 Grails GORM。持久性是用 GORM 魔法解决的。每个 Domain 类都提供一组动态方法来解决典型的 CRUD 操作,包括临时查询。

    断言

    “说明操作的后置条件以及类和聚合的不变量。如果断言不能直接用您的编程语言编码,请为它们编写自动化单元测试。”
  • 看看 Groovy @Invariant, @Requires, @Ensures注释,这些可用于声明 DbC 风格的不变量和前置和后置条件
  • 当您使用 Grails 命令行创建域类时,会自动创建测试类,这是在域中表达断言的另一种机制。

  • 声明式设计风格

    “灵活的设计可以让客户端代码使用声明式的设计风格。为了说明这一点,下一节将汇集本章中的一些模式,以使规范更加灵活和声明性。”

    这是 Grails 的优势所在,因为 Groovy 语言的动态特性和用于创建自定义 DSL 的构建器模式支持。

    分层架构

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

    关于grails - 带 Grails 的 DDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2378069/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com