用一些智慧创建域 Class

Creating a Domain Class with Some Smarts

所以我有一个定义明确的架构。支持它的数据存储将允许此请求。 (MongoDB).

假设我有一个用户 class:

class User
  emailAddress
  name

如果我合并来自另一个来源的数据(比如说 map/params,我可以正确识别来源。)我的目的是将未使用的属性放在用户 class。

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

我的问题是:我将如何设计域 class 以便它可以在创建对象时处理所有这些? (我愿意放入示踪剂 属性 来表示来源)[即添加 [来源:Facebook]]

输出 class 看起来,并被序列化为:

从 Facebook 返回的信息将是 [姓名:Jim,电子邮件:bo@jim.com,friends:1000,level:42]。结果 class 将是:

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

解决这个问题的最佳方法是什么?它会破坏域 class 模型吗? expando 可以在这里工作吗?

我认为设计域的最佳方法 class 是考虑将其他用户的属性 (extraProperties) 保存为序列化 'document' 类型的对象。如果您要将示例地图转换为 JSON/GSON 或 XML (Converters) 并将其作为文档/大型 nvarchar 保存到数据库中,则您可以灵活地使用每个用户来源的不同属性。

然后您可以将自定义的 getter 和 setter 添加到您的域对象中,这将转换/吞噬文档,并将其作为地图呈现给您的 controllers/services

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
}