2012-04-25 2 views
2

私は以下の方法でクライアントサーバーアプリを持っています。オプションで、protobuf-netまたはNHibernateのいずれかのオブジェクトであるフィールドを取得できますか?

enter image description here

は、ドメイン内のいくつかのクラスは、子供たちのコレクションを持っています。子供の中には親を参照するものもあります。

問題は、サーバーに子オブジェクトの要求が行われたときに、他のすべての子が応答と共に返されることです。多くの状況では、子供の親オブジェクトにアクセスすることは非常に役立ちます。親のために別のリクエストをしなくても、より多くの往復が必要になります。

通常Nhibernates遅延ロードは、このの世話をするだろうがいるProtobufネット(またはその他のシリアライゼーション)との相互作用は、すべてのフィールドをシリアル化するアクセスされることを意味します。クライアントはデータベースに直接アクセスできません。

protobuf-netまたはNhibernateのオブジェクト参照深度を、2つ以上のオブジェクトを深く読み込まないというフラグをサーバーに要求できるように制限することは可能ですか?

注文商品 - 配送情報。

注文のリクエストで1つの制限は、配信情報を読み込まないことを意味します。 0の制限は、注文アイテムをロードしないことを意味します。

代替として、参照がロードされるのをオプションで停止することができます(制限は0または無制限です)。これは、より制限的ですが実装可能性が高い可能性があります。

答えて

2

protobuf-netはShouldSerialize *パターンをサポートしています(IDE/PropertyGridやXmlSerializerを含むいくつかのBCL実装と共通)。

お持ちの場合:

[ProtoMember(1)] 
public int Whatever { get; set; } 

とそれに対応する:

public bool ShouldSerializeWhatever() { 
    ... 
} 

その後ShouldSerializeWhateverがtrueを返した場合のみ、シリアル化されるものは何でも。このパターンは完全に名前ベースです。このメソッドはpublicでもnon publicでも構いません(ただし、XmlSerializerはpublicメソッドしか受け付けませんので、複数のシリアライザを使用している場合はpublicにしておきます)。

+0

ありがとうMarc、私はIMOで私の契約をAddType、AddField、AddSubTypeを直接呼び出すという賢明な方法を定義しています。 AddFieldの戻り値に対してメソッドSetSpecifiedが見つかりましたが、メソッドが与えられたときに同じ結果を返します。 –

+0

@James - はい、それは同じことです。名前付けは、サポートされている '* Specified' BCLパターンと、このパターンが(ShouldSerialize *ではなく)双方向の使用を可能にするという事実によるものです。しかし、同じこと。 –

0

これは単なるシリアルであるため、これは実際にはprotobuf-netとは何の関係もなく、あなたが与えるものをシリアライズするだけなので、2レベルの深さを与えなければなりません。

これは本当にすべてあなたのロジックで行われます。私があなたがやっていると仮定しているのは、nhibernateから出てくる実際のオブジェクトをシリアライズすることです。おそらく、サービスからの応答として代わりに使用されるintroduce DTO'sがあります。オブジェクトのデータをDTOにコピーすることで、2レベルしか移動できなくなります。

データをDTOにコピーするのは面倒なことがあります。AutoMapperのようなプロジェクトでは、その面であなたの人生をよりシンプルにすることが目標ですが、 2レベルの深さなので、手動によるマッピングが必要な場合があります。

+0

protobuf-netに「このメンバをシリアル化しないでください」というオプションがあるのだろうかと思いました。Nhibernateの遅延ロードを再び有効にすることができます。あなたは、ドメインオブジェクトを直接シリアライズしているという点では正解です。 –

+0

私はDTOルートを主張します。メンバーを無視するように属性を追加することはできますが、クライアントに送信するときにそのメンバーをシリアル化する必要がある別の場所に移動する可能性が高いためです。マッピングではなくコアオブジェクトをシリアライズします。 –

+0

ここに私が話しているものの例があります:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ –