3

私は現在、Nhibernate + WCF + WPF を使用する .Net n 層アプリに手を出している学生です。

非常にひどく行われていることの 1 つは、オブジェクト グラフのシリアル化です。実際にはまったく行われていません。現在、関連付けは無視され、どこでも DTO を使用しています。

私が言える限り、続行する方法の 1 つは、どのオブジェクトとコレクションをロードしてシリアル化し、ネットワークを経由するかを事前に定義することです。これにより、いくつかの関連付けをクライアントに提示できますが、これは制限があり、柔軟性がなく、一貫性がないように見えます (できますか?私はこの考えが気に入らないと言ってください)。

私が思いついたオプションの 1 つは、クライアント層でコレクションを遅延ロードする NHProxy を、ネットワーク経由で関連するものを取得する「disconnectedProxy」に単純に置き換えることでした。これは、Web サービス シグネチャを少し拡張し、生成されたプロキシに対していくつかのハッカーを実行する必要があることを意味しますが、これは T4/その他のコード生成実験としては優れているように思えました。

私が知る限り、これは一般的な障害のようですが、多くの読書を行った後、適切な/一般的に受け入れられている解決策を見つけることができませんでした. 私は特定の解決策と同じくらい方向性を探していますが、クライアントにつながりを「感じさせる」簡単な方法があれば教えてください.

4

3 に答える 3

6

あなたは非常に良い質問をしますが、残念ながら非常に明確な答えはありません。遅延読み込みをWCFで機能させることができたとしても(これは可能でした)、プロキシインターセプターの使用には問題があります。これを信じてください。クライアント層にPOCOオブジェクトが必要です。

あなたが本当に考慮する必要があること...私が見た研究からこの問題への業界標準のアプローチとして考えられてきたものは、永続性対使用法または永続性の無知と呼ばれています。つまり、オブジェクトモデルとマッピングは永続ドメインを表しますが、理想的な使用シナリオとは一致しません。いくつかのプロパティを表示するためだけにデータベース全体をクライアントにダウンさせたくないですか?

このような単純な問題のように見えますが、解決策は非常に単純であるか、非常に複雑です。一方では、使用シナリオに合わせてエンティティを設計できますが、オブジェクトドメインが急増し、保守が困難になります。一方、きめ細かいビジネスロジックを作成するには、リッチオブジェクトモデルの関係が必要です。

この問題を単純化するために、データベースとデータベース/サービス層の間、およびサービスとクライアントのギャップの間で埋める必要のある2つの主要なギャップを調べてみましょう。NHibernateは、オブジェクトにデータをロードするためのORMを提供することにより、最初の1つを問題なく埋めます。それはまともな仕事をしますが、素晴らしいパフォーマンスを達成するために、カスタムローディング戦略を使用して微調整する必要があります。私は逸脱します…</p>

サーバーとクライアントの間の2番目のギャップは、物事が危険にさらされる場所です。簡単にするために、マップされたエンティティをネットワーク経由でクライアントに送信しなかった場合を想像してみてください。ビジネスエンティティをDTOオブジェクトに交換し、同様にDTOオブジェクトをビジネスエンティティに交換するメカニズムを作成してみてください。そうすれば、クライアントはDTO(もちろんPOCO)のみを処理し、ビジネスロジックはその豊富な構造を維持できます。これにより、NHibernateの遅延読み込みメカニズムだけでなく、L1キャッシュなどのセッションからの他の利点を活用できます。

簡潔さと知的財産の理由から、私は上記のメカニズムの設計には立ち入りませんが、うまくいけば、これはあなたを正しい方向に向けるのに十分な情報です。パフォーマンスや遅延をまったく気にしない場合は、遅延読み込みをすべてオフにして、シリアル化の問題に対処してください。

于 2008-12-19T06:23:17.650 に答える
1

しばらく経ちましたが、インジェクション/切断されたプロキシは思ったほど悪くないかもしれません. あなたは学生なので、時間があり、ちょっといじりたいと思っていると思います。

独自のカスタム シリアライゼーション/デシリアライゼーション ロジックを挿入する場合は、 DataContractSerializerOperationBehaviorを使用して適用できるIDataContractSurrogateを使用できます。私はこれでいくつかの基本的なことを行っただけですが、調べる価値があるかもしれません. このレイヤーに楽しいロジック (ハックの可能性あり) を追加することで、より接続性を高めることができるかもしれません。

これは、同じ認識に達した誰かに関する MSDN の投稿です。NHibernateで使用される DynamicProxy により、遅延読み込みを行う NHibernate オブジェクトを直接シリアル化することができなくなります。

于 2008-12-19T04:21:19.847 に答える
0

ネットワークを介してオブジェクト グラフを転送し、遅延読み込み機能を維持することが本当に決定されている場合。ここで作成したコードをいくつか見てみましょうhttp://slagd.com/?page_id=6。基本的に、ネットワークの反対側に偽のセッションを作成し、nhibernate プロキシがその機能を保持できるようにします。それが正しい方法だとは言いませんが、いくつかのアイデアが得られるかもしれません。

于 2009-03-25T21:56:35.857 に答える