2017-06-02 2 views
0

データオブジェクトがPatientであり、List<Patient>をUIウィジェットにバインドしているとします。私たちは、データベースにレコードを書き込む前暗号MedicalNotes財産の内容にしたい暗号化クラスとリスト<T>

public class Patient 
{ 
    public Patient(){} 
    public string Name {get;set;} 
    public string MedicalNotes {get;set;} 
} 

(私たちは小さな会社であり、透過的な暗号化機能を提供していますSQLデータベースのライセンス料を買う余裕はないと仮定) の内容をUIウィジェットにバインドする前に解読します。

たちはシングルトン暗号クラスをインスタンス化し、リスト内の各患者のオブジェクトは、暗号化オブジェクトのメソッドを呼び出すことができるように、Patientコンストラクタにそれへの参照を養いますか?

それとも暗号インスタンスはPatient対象外に滞在し、データベースのIOクラスとあなたのデータベース層は、この追加されたセキュリティを必要とList<Patient>

+1

IMOの 'Patient'クラスは、自分自身の暗号化やデータベースへの保存に責任を持ちません。 *患者*を表すはずです。 – Amy

+0

@Amy:私はあなたにこれに同意する傾向があります。 – Tim

+0

モデルをデータベースにどのように保存しますか?いくつかのORM?プレーンな古いSQL? XMLのシリアル化? – dymanoid

答えて

1

私はあなたが3層に分かれていますが、モデル層は暗号化プロセスを気にせず、どちらのデータベースも気にしません。これらの責任は、他の当事者に入れなければならない:

モデル層:

public class Patient 
{ 
    public string Name { get; set; } 
    public string MedicalNotes { get; set; } 
} 

データベース層:

public static class PatientDb 
{ 
    public static void SavePatient(Patient patient) 
    { 
     //whatever happens here, you didn't post this 
    } 
} 

中間層:

public class PatientHelpers 
{ 
    public void SavePatient(Patient unencryptedPatient) 
    { 
     var encrypted = Crypto.EncryptPatient(unencryptedPatient); 
     PatientDb.SavePatient(encrypted); 
    } 
} 

public static class Crypto 
{ 
    public Patient EncryptPatient(Patient patient) 
    { 
     //whatever happens here, you didn't post this 
     return patient; 
    } 
} 
+0

ありがとうございます。私はこのような懸念の分離が好きです。 SelectCommandがDataTableを返し、各行が 'Patient'オブジェクトにマップされると、暗号化された列は、対応するPatientプロパティに割り当てられる前に復号化されます。 – Tim

1

間を仲介ありません。だから私はそれがその層に属していると思います。保存する前に暗号化し、読み込んだ後に復号化します。