2

我的要求是创建一个高效的版本转换器设计。让我们假设在每个版本中都进化了以下类。

//版本1

    internal class PatientV1
    {
        public string FullName { get; set; }
        public string PatientNr { get; set; }
        public GenderV1 Gender { get; set; }
    }

    internal enum GenderV1
    {
        MALE,
        FEMALE
    }

//版本2

    internal class PatientV2
    {
        public Name FullName { get; set; }
        public string PatientNr { get; set; }
        public GenderV2 Gender { get; set; }
    }

    internal class Name
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Title { get; set; }
    }

    internal enum GenderV2
    {
        MALE,
        FEMALE,
        UNKNOWN
    }

//版本3

    internal class PatientV3
    {
        public IPerson Person { get; set; }
        public string PatientNr { get; set; }
    }

    internal interface IPerson
    {
        Name Name { get; set; }
        GenderV3 Gender { get; set; }
    }


    internal class Person : IPerson
    {
        public Name Name { get; set; }
        public GenderV3 Gender { get; set; }
    }


    internal enum GenderV3
    {
        MALE,
        FEMALE,
        MALE_TO_FEMALE_CONVERSION_INPROGRESS,
        FEMALE_TO_CONVERSION_INPROGRESS,
        UNKNOWN
    }

我创建了 JsonConverter 以将一个版本反序列化为另一个版本。这增加了许多转换器组合((n-1)!),例如。

  1. PatientV1ToV2Converter 从版本 1 转换到版本 2
  2. PatientV1ToV3Converter 从版本 1 转换到版本 3
  3. PatientV2ToV3Converter 从版本 2 转换到版本 3

因此,我希望 PatientV1ToV3Converter 调用 PatientV1ToV2Converter 将患者从 PatientV1 带到 PatientV2,然后 PatientV1ToV3Converter 在 PatientV2 上工作以使其成为 PatientV3,而不是这个。

所有这些我都希望在应用程序目录中不存在任何旧版本的 Patient(PatientV1 和 PatientV2)。

任何设计,无论是否有旧的 dll 限制,我都可以。

4

2 回答 2

2

我在我的项目中做了类似的事情

我已经设定

serializerSettings.Converters = new List<JsonConverter>() { new MyAppVersionConverter() };

在此MyAppVersionConverter,我重写ReadJson并编写了以下代码

JObject jObjectV = JObject.Load( reader );
//Get the type information from JObject by getting the "$type" property and strip it to get the version
string objectVersion = GetVersion(jObjectV.GetValue("$type"));

现在要么通过添加或删除属性来修改现有jObjectV的以转换为所需的版本,然后

例如从我的代码

JProperty firstNameProp = new JProperty( "FirstName", firstName );
JProperty lastNameProp = new JProperty( "LastName", lastName );
JProperty typeProperty = new JProperty( "$type", "MyDetailV2.EmployeeDetail, MyDetailV2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" );

JObject jObjectV2 = new JObject();
jObjectV2.Add( typeProperty );
jObjectV2.Add( firstNameProp );
jObjectV2.Add( lastNameProp );

return jObjectV2.ToObject<EmployeeDetail>();

我还在提炼东西。完成完整更改后,我将发布。

如果您在这方面有任何问题,请告诉我

于 2012-11-29T13:46:54.547 回答
0

你的方法是合理的。其他一些项目也使用类似的方法来处理升级。

例如,MythTV 项目使用相同的想法如何从任何旧版本实时升级数据库模式。到目前为止,他们已经能够无缝处理300 多个修订

于 2012-11-16T09:52:07.193 回答