2013-05-01 75 views
3

鑑於這些功能要求:如何設計Grails中的域類?

用戶管理

  1. 管理員
  2. 館員
  3. 借款人

*用戶有權通過OpenID到登錄的選項。

物業管理

  1. 備忘錄
  2. 通知
  3. 許可證

通常情況下,我會在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,我還沒有使用它。我的問題是, 類應如何根據上述要求設計?我不能使用接口,而且看起來繼承不是一個好習慣。我的想法是使用構圖,雖然我很困擾將生成的數據庫表。這種情況下的最佳做法是什麼?

+0

有時它更容易啓動與數據庫架構和向後工作。試着這樣想。 – 2013-05-01 12:05:32

回答

11

那麼首先讓我們糾正它,你可以在這種情況下使用inheritance。您只需要將has a關係的慣例更改爲is a的關係。

很少有因素需要注意: 1. Grails在約定優於配置的情況下工作。 2.您可以使用包裝持久層的GORM,並在Hibernate的幫助下爲底層持久層創建一個對象映射。

根據您的功能要求: -

如果你不希望有User持久化的一部分,你可以有一個abstractUser可容納用戶包括openId屬性的公共屬性。它必須按照慣例放置在src\groovy目錄中(因爲基類是抽象的,依賴注入將被定義)

Property也是如此。摘要Propertysrc\groovy

現在進入商業模式,extend每個具體實體(domain類)都來自abstract家長。

摘要: -

  • 創建的Grails應用

  • 在src目錄下\常規(例如,我正在考慮的基本結構):

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 = { 
     } 
} 

所以上等堡壘H。 grails-app/domain下的Groovy對象被Grails約定視爲具體實體。更多的信息你可以明顯地發現here。如果遇到情景,你也可以使用構圖,實際上我已經提到在UserOpenId

注: - 這是上下文的Grails的最新版本(> 2.X)

+0

謝謝!但據我瞭解,如果我將抽象類放在src/groovy中,那麼在數據庫中將不會創建用戶和屬性表。我對麼?我假設我們的客戶需要一張適用於所有用戶和所有屬性的表格。 – renz 2013-05-01 04:00:18

+1

是的,在這種情況下,您可以將它們都作爲grails-app/domain中的域對象。 – dmahapatro 2013-05-01 04:09:11