如何在Grails中设计域类?

如何在Grails中设计域类?,grails,orm,domain-driven-design,gorm,Grails,Orm,Domain Driven Design,Gorm,鉴于这些功能要求: 用户管理 管理员 图书管理员 借贷者 *用户可以选择通过OpenID登录 物业管理 书 备忘录 圆形 许可证 通常,我会在Java中实现这些: interface User {} class Librarian implements User {} class Administrator implements User {} class Borrower implements User {} class OpenID {} //all Users HAS AN OpenID

鉴于这些功能要求:

用户管理

  • 管理员
  • 图书管理员
  • 借贷者
  • *用户可以选择通过OpenID登录

    物业管理

  • 备忘录
  • 圆形
  • 许可证
  • 通常,我会在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,我还没有使用过Groovy和Grails。我的问题是,,
    如何根据上述要求设计类?我不能使用接口,而且继承似乎不是一个好的实践。我的想法是使用组合,尽管我对将生成的数据库表感到非常烦恼。这种情况下的最佳实践是什么?

    首先,让我们纠正它,在这种情况下,您可以使用继承。您只需将
    具有
    关系的约定更改为
    关系

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

    根据您的功能要求:-

    如果您不想让
    用户
    作为持久性的一部分,您可以使用
    抽象
    用户
    ,它可以保存用户的公共属性,包括
    openId
    属性。必须按照约定将其放置在
    src\groovy
    目录中(因为基类是抽象的,所以将定义依赖注入)

    属性也是如此。在
    src\groovy
    中抽象
    Property

    现在谈到业务模型,
    抽象
    父级扩展每个具体实体(
    类)

    总结:-

    • 创建grails应用程序

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

    User.groovy:-

    abstract class User{
        String name
        String emailId
        OpenID openId
    }
    
    Property.groovy:-

    abstract class Property{
        String propertyName
    }
    
    • grails应用程序/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约定,grails app/domain下的Groovy对象被视为具体实体。你显然可以找到更多的信息。如果遇到场景,您也可以使用组合,事实上我已经在
    User
    having
    OpenId
    中提到了这一点


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

    谢谢!但据我所知,如果我将抽象类放在src/groovy中,那么数据库中将不会创建任何用户表和属性表。我说得对吗?我假设我们的客户机希望为所有用户和所有属性创建一个表。是的,在这种情况下,您可以在grails app/domain中将它们作为域对象。有时,从数据库模式开始并向后工作会更容易。试着这样想。