【问题标题】:How to design domain classes in Grails?如何在 Grails 中设计领域类?
【发布时间】:2013-05-01 03:06:16
【问题描述】:

鉴于这些功能要求:

用户管理

  1. 管理员
  2. 图书管理员
  3. 借款人

*用户可以选择通过 OpenID 登录。

物业管理

  1. 书籍
  2. 备忘录
  3. 圆形
  4. 许可证

通常,我会在 Java 中将这些实现为:

interface User {}
class Librarian implements User {}
class Administrator implements User {}
class Borrower implements User {}

class OpenID {} //all Users HAS AN OpenID attribute (NULL if non-openId login)

interface Property{}
class Book implements Property{}
class Memorandum implements Property{}
class Circular implements Property{}
class License implements Property{}

但我们的项目将使用 Groovy 和 Grails,我还没有使用过。我的问题是, domain 类应该如何根据上述要求设计?我不能使用接口,而且似乎继承不是一个好习惯。我的想法是使用composition,尽管我对生成的数据库表感到很困扰。在这种情况下,最佳做法是什么?

【问题讨论】:

  • 有时从数据库模式开始并向后工作更容易。试着这样想。

标签: grails orm domain-driven-design grails-orm


【解决方案1】:

首先让我们更正它,在这种情况下您可以使用inheritance。您只需将has a 关系的约定更改为is a 关系即可。

需要注意的几个因素: 1. Grails 致力于约定优于配置。 2. 可以使用GORM封装持久层,并在Hibernate的帮助下为底层持久层创建对象映射。

根据您的功能要求:-

如果您不想将User 作为持久性的一部分,您可以拥有一个abstractUser,它可以包含用户的公共属性,包括openId 属性。必须按照约定放在src\groovy目录下(因为基类是抽象的,依赖注入会被拒绝)

Property 也是如此。 src\groovy 中的抽象 Property 类。

现在进入业务模型,extend 来自 abstract 父级的每个具体实体(domain 类)。

总结:-

  • 创建 grails 应用程序

  • src\groovy下(比如我在考虑一个基本结构):

User.groovy:-

abstract class User{
    String name
    String emailId
    OpenID openId
}

Property.groovy:-

abstract class Property{
    String propertyName
}
  • grails-app/domain下:

Librariran.groovy:-

class Librarian extends User{
   //Attributes specific to Librariran
   static constraints = {
   }

   static mapping = {
   }
}

Book.groovy:-

class Book extends Property{
    //Attributes specific to Book
       static constraints = {
       }

       static mapping = {
       }
}

如此等等。 grails-app/domain 下的 Groovy 对象按照 Grails 约定被视为具体实体。您显然可以找到更多信息here。如果遇到场景也可以使用合成,事实上我已经在User 中提到了OpenId

注意:- 这是最新版本 Grails (> 2.x) 的上下文

【讨论】:

  • 谢谢!但据我了解,如果我将抽象类放在 src/groovy 中,则不会在数据库中创建 User 和 Property 表。我对么?我假设我们的客户想要一个用于所有用户和所有属性的表。
  • 是的,在这种情况下,您可以将它们都作为域对象包含在 grails-app/domain 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多