2015-04-16 26 views
1

所以我有一個很好定義的模式。支持它的數據存儲將允許此請求。 (MongoDB的)。用一些Smarts創建一個域類

可以說我有一個用戶等級:

class User 
    emailAddress 
    name 

如果我的數據從另一個源合併(可以說地圖/參數,可以和我都能夠正常識別的源)。我的目的是將未使用的屬性放在User類的結構中。

例如:如果我從Facebook導入用戶,他們將擁有除電子郵件地址或名稱之外的各種屬性。我不知道如何處理這些。

我的問題是:我將如何設計一個域類,以便它可以處理所有這些對象的創建? (我願意放置一個示蹤物來表示來源)[I.e.加入[來源:Facebook的]

的輸出級看起來,和序列化爲這樣:

從Facebook回來的信息將是[名:吉姆,電子郵件:[email protected],朋友們: 1000,等級:42]。由此產生的類將是:

class User 
    emailAddress : [email protected] 
    name: Jim 
    extraProperties: [Facebook, [friends:1000, level:42]] 

這是怎麼回事?它會破壞域類模型嗎? expando是在這裏可以工作的東西嗎?

回答

1

我認爲最好的設計你的域類的方法是查看保存額外的用戶屬性(extraProperties)作爲序列化的「文檔」類型對象。如果您要將示例映射轉換爲JSON/GSON或XML(Converters),並將其作爲文檔/大型nvarchar保存到數據庫,則您可以靈活地爲每個用戶源提供不同的屬性。

然後,您可以添加自定義的getter和setter這將轉換/啜文檔您的域對象,並將其顯示爲一個地圖到您的控制器/服務

String extraProperties 

def setExtraProperties(def properties){ 
    this.extraProperties = (properties as JSON)?.toString() 
} 

def getExtraPropertiesMap() { 
    def jsonSlurper = new JsonSlurper() 
    def extraProps = jsonSlurper.parseText(this.extraProperties) 

    return extraProps //you can then access this using map syntax, eg. extraProps.Facebook.friends 
}