【发布时间】: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
$typefield 处理此问题。您可以创建自己的类型转换器来检查一些元数据属性并创建正确的对象。 -
你确定你想使用这样的模式吗?这让客户的生活变得非常艰难。如果你设计一个合适的模式会更好,实际上使用 JSON Schema 或者 Swagger/OpenAPI,这样客户就可以知道会发生什么,甚至自动生成 DTO。
-
Abstract Factory 无助于解析序列化数据,任何其他 GoF 设计模式也无济于事。考虑使用上面建议的现有库。在您选择的任何解决方案中也要考虑开放/封闭原则。
标签: c# design-patterns abstract-factory