如何在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
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
havingOpenId
中提到了这一点
注意:-这是Grails(>2.x)最新版本的上下文谢谢!但据我所知,如果我将抽象类放在src/groovy中,那么数据库中将不会创建任何用户表和属性表。我说得对吗?我假设我们的客户机希望为所有用户和所有属性创建一个表。是的,在这种情况下,您可以在grails app/domain中将它们作为域对象。有时,从数据库模式开始并向后工作会更容易。试着这样想。