2016-03-19 22 views
0

私のドメインモデルオブジェクトは、ほとんどがプライマリフィールドを持ち、不変型を適用するアトミックメソッドによって状態が変更されます。私は本当にプライベートプロパティを使用せず、フィールドとして保持しています。プロパティだけでなくプライベートフィールドを含めるようにRavenDbのシリアル化を修正してください

シリアル化にプライベートフィールドを含めるようにRavenDbを設定する方法はありますか?

私は、RavenDbがフードの下で使用すると思うJSON.Netライブラリのthis postに記載されているものと似ていますが、説明されているものを実装する方法がわかりません。

私が見ることができるが、このです:

docStore.Conventions.CustomizeJsonSerializer 

しかし、私はまだどこのフィールドを含めるためにそれを指示することを見つけ出すことはできませんか?アレクセイの提案ポストに続き

+2

この1つは古いですが、あなたを助けるかもしれませんします。https: //dotbrand.wordpress.com/2010/07/05/entities-with-privateprotected-setters-in-ravendb/ Ayendeは、カスタム 'JsonContractResolver'を実装することでこれを行うことができると書いています –

+0

Thanks @AlexeyZimarev - その投稿は本当に便利です。 –

+0

ドメインオブジェクトを直接シリアル化すると、ドメインモデルが大幅に制約されることに注意してください。ドメインモデルに永続性の懸念があります(またはまだドメインモデルを持っていない場合は間もなくなります)。この決定を下す前に、永続性モデルを作成してトレードオフを分析することを検討してください。 – theDmi

答えて

3

が正しい方向に私を指摘し、ポストが実際に廃止予定のプロパティを使用しています - これは私がそれをやった方法です:

public class IncludeNonPublicMembersContractResolver : DefaultContractResolver 
{ 
    protected override List<MemberInfo> GetSerializableMembers(Type type) 
    { 
     var members = new List<MemberInfo>(); 

     members.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)); 
     members.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)); 

     return members; 
    } 
} 

docStore.Conventions.JsonContractResolver = new IncludeNonPublicMembersContractResolver(); 
関連する問題