私の要件は、効率的なバージョン コンバーターの設計を作成することです。各バージョンで次のクラスが進化しているとします。
//バージョン 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 からバージョン 2 に変換する PatientV1ToV2Converter
- バージョン 1 からバージョン 3 に変換する PatientV1ToV3Converter
- バージョン 2 からバージョン 3 に変換する PatientV2ToV3Converter
したがって、これの代わりに、PatientV1ToV3Converter が PatientV1ToV2Converter を呼び出して、PatientV1 から PatientV2 に患者を移動し、PatientV1ToV3Converter が PatientV2 を処理して、PatientV3 にします。
これらはすべて、Patient の古いバージョン (PatientV1 および PatientV2) がアプリケーション ディレクトリに存在することなく実行したいと考えています。
古い dll 制限の有無にかかわらず、どのような設計でも問題ありません。