如何在FHIR .NET API中支持资源的自定义成员?
如何在FHIR .NET API中支持自定义扩展字段(无需修改源码)
我正在对接一个带有资源自定义成员的FHIR服务器,收到的Patient资源示例如下:
<Patient xmlns='http://hl7.org/fhir'><hasSuperPower></hasSuperPower></Patient>
想知道怎么在FHIR .NET API中添加对这个额外标签的支持,让反序列化器能处理它并存入Patient对象。之前看到Mirjam Baltus的文章提到可以用分部类扩展模型类,但不确定是不是必须修改FHIR API源码重新编译?有没有不用修改源码、直接用NuGet提供的DLL的实现方式?
无需修改源码的完美方案
完全不用碰FHIR .NET API的源码,利用C#分部类的特性就能轻松实现,步骤很清晰:
1. 创建同命名空间的Patient分部类
在你自己的项目里新建一个C#类文件,定义和FHIR API中Patient类同名同命名空间的分部类,这样编译器会自动把两个类合并:
using Hl7.Fhir.Model; namespace Hl7.Fhir.Model { public partial class Patient { // 用[FhirElement]标记对应XML里的自定义标签 [FhirElement("hasSuperPower")] public FhirBoolean HasSuperPower { get; set; } } }
这里的[FhirElement]属性是FHIR .NET API内置的,括号里的名称必须和XML中的自定义标签完全匹配。如果你的字段是字符串类型,就用FhirString,数值类型用FhirDecimal,以此类推。
2. 配置反序列化器允许未知成员
默认的解析器会忽略未定义的字段,所以需要在初始化解析器时开启允许未知成员的选项:
// 初始化XML解析器并配置允许未知成员 var xmlParser = new FhirXmlParser(new ParserSettings { AcceptUnknownMembers = true }); // 反序列化XML字符串到Patient对象 var patient = xmlParser.Parse<Patient>(yourXmlContent); // 访问自定义字段的值 bool? hasSuperPowerValue = patient.HasSuperPower?.Value;
原理说明
FHIR .NET API的官方模型类本身就是以分部类的形式编写的,这就是为了方便开发者在不修改源码的前提下扩展模型。你在自己项目中创建的分部类会和NuGet包中的类合并,完全兼容官方DLL,不需要重新编译任何源码。
复杂自定义字段的处理
如果你的自定义标签是嵌套的复杂结构,比如:
<Patient xmlns='http://hl7.org/fhir'> <superPower> <name>飞行</name> <level>3</level> </superPower> </Patient>
你可以先定义对应的分部类:
namespace Hl7.Fhir.Model { public partial class SuperPower : BackboneElement { [FhirElement("name")] public FhirString Name { get; set; } [FhirElement("level")] public FhirInteger Level { get; set; } } public partial class Patient { [FhirElement("superPower")] public SuperPower PatientSuperPower { get; set; } } }
同样的方式配置解析器后,就能正常反序列化复杂结构了。
内容的提问来源于stack exchange,提问作者Beika Zhan
相关产品推荐
相关产品推荐

