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. バージョン 1 からバージョン 2 に変換する PatientV1ToV2Converter
  2. バージョン 1 からバージョン 3 に変換する PatientV1ToV3Converter
  3. バージョン 2 からバージョン 3 に変換する PatientV2ToV3Converter

したがって、これの代わりに、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 に答える