【问题标题】:Abstract Factory create objects based on different json format抽象工厂根据不同的 json 格式创建对象
【发布时间】:2021-08-27 09:08:25
【问题描述】:

我们需要创建几种基于不同json格式的动态元数据,例如: 元数据1

"metadata1": [{
        "item1": "address1",
        "date": "Jan -Jun22",
        "tag": true,
        "itemurl":"item url"
      }]
}

元数据2

{
    "amount": 100,
    "item3": {
        "amount:" 1200,
        "currency": "AUD"
      }
    "item4": [
        "blabla",
        "yaliyada"
      ],
    "flag": true,
    "count": 2
}

我们有那些元数据 id,我正在考虑以下实现

public static IMetaData RetrieveMetaData(string metadatDetails, string metadataId)
        {
            switch (metadataId)
            {
                case "metatdata1":
                    return JsonSerializer.Deserialize<MetaData1>(metadatDetails);
                case "metatdata2":
                    return JsonSerializer.Deserialize<MetaData2>(metadatDetails);
                case "metatdata3":
                    return JsonSerializer.Deserialize<MetaData3>(metadatDetails);
                default:
                    return null;
            }
        }

使用抽象工厂有更好的实现吗?我对设计模式不太熟悉。我正在考虑删除开关块,不确定是否可能。 感谢您的提前。

【问题讨论】:

  • 除了重新调整 null 之外,它真的没有什么问题,但这是一个设计选择。但是,根据确切的 json 合同,可能还有其他选项
  • 我同意,这对我来说看起来不错。我也会坚持使用开关。
  • JSON.NET 由emitting a custom $type field 处理此问题。您可以创建自己的类型转换器来检查一些元数据属性并创建正确的对象。
  • 确定你想使用这样的模式吗?这让客户的生活变得非常艰难。如果你设计一个合适的模式会更好,实际上使用 JSON Schema 或者 Swagger/OpenAPI,这样客户就可以知道会发生什么,甚至自动生成 DTO。
  • Abstract Factory 无助于解析序列化数据,任何其他 GoF 设计模式也无济于事。考虑使用上面建议的现有库。在您选择的任何解决方案中也要考虑开放/封闭原则。

标签: c# design-patterns abstract-factory


【解决方案1】:

你不能逃避条件映射。无论哪种方式,您都必须拥有某种具有业务逻辑的决策机制。无论您是从配置中还是在 switch 语句中确定,这只是一个实现细节。所以在我看来,这完全是一个好方法。 这里要考虑的一件事是您的“默认”行为。由于我不熟悉您的业务逻辑,因此无法提出太多建议,但建议您注意这一点并考虑可能在那里抛出异常。 另一个增强功能可能是将您的“元数据 ID”存储在不使用硬编码字符串的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多