3

鉴于这些功能要求:

用户管理

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

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

物业管理

  1. 备忘录
  2. 执照

通常,我会在 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,我还没有使用过。我的问题是,应该如何根据上述要求设计领域类?我不能使用接口,而且似乎继承不是一个好习惯。我的想法是使用composition,尽管我对生成的数据库表感到非常困扰。在这种情况下,最佳做法是什么?

4

1 回答 1

12

那么首先让我们纠正它,你可以inheritance在这种情况下使用。您只需要将关系的约定更改has ais a关系。

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

根据您的功能要求:-

如果您不希望将其User作为持久性的一部分,您可以拥有一个可以保存 User 的公共属性(包括属性)的abstract 类。它必须按照约定放在目录中(由于基类是抽象的,依赖注入将被拒绝)UseropenIdsrc\groovy

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

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

概括:-

  • 创建 grails 应用程序

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

用户.groovy:-

abstract class User{
    String name
    String emailId
    OpenID openId
}

属性.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 约定被视为具体实体。您显然可以在此处找到更多信息。如果遇到场景也可以使用组合,事实上我已经UserOpenId.

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

于 2013-05-01T03:40:22.983 回答