使用一些Smarts创建域类

时间:2015-04-16 04:45:11

标签: mongodb grails

所以我有一个定义良好的模式。支持它的数据存储将允许此请求。 (MongoDB的)。

假设我有一个Users类:

class User
  emailAddress
  name

如果我合并来自其他来源的数据(比如说map / params,我可以正确识别来源。)我的意图是将未使用的属性放在User类的结构中。

例如:如果我从Facebook导入用户,他们将在emailAddress或名称之外拥有各种属性。我还不知道如何处理这些问题。

我的问题是:我如何设计一个域类,以便它可以在创建对象时处理所有这些? (我愿意用一个示踪物来表示来源)[即。添加[来源:Facebook]]

输出类看起来如此序列化:

从Facebook回来的信息将是[姓名:Jim,电子邮件:bo@jim.com,朋友:1000,级别:42]。结果类将是:

class User
   emailAddress : bo@jim.com
   name: Jim
   extraProperties: [Facebook, [friends:1000, level:42]]

解决这个问题的最佳方式是什么?它会打破域类模型吗? expando可以在这里运作吗?

1 个答案:

答案 0 :(得分:1)

我认为设计域类的最佳方法是将其他用户的属性(extraProperties)保存为序列化文档'类型对象。如果您要将示例Map转换为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
}