3

JsonResultMVCコントローラーの標準Json(object)メソッドを使用して返そうとしています。私のタイプのオブジェクトはModel1Fluent NHibernate によって構築されています。

Model1は type のプロパティを持っていますModel2。デバッグ モードでは、環境がModel2呼び出されたプロキシの子孫クラスを作成することがわかりますCastle.Proxies.Model2Proxy。これは、私のマッピングを満たすために、Fluent Nhibernate によって内部的に使用されていると思います。そして実行時に、実際の model1.Model2 は typeCastle.Proxies.Model2Proxyです。

問題は、 myModel1がシリアライズされているときに、 もシリアライズModel2されていることです。そして、シリアライザーは、Castle によって生成され、私には必要のないものを含め、このオブジェクトのすべてのプロパティをシリアル化しようとしているようです。例外が発生しなければ問題ありません。つまり、このオブジェクト内のどこかに循環参照が存在し、それが原因で例外が発生します。例外テキストは次のとおりです。

System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'

ドメインを再確認したところ、そこに循環参照が見つからなかったので、Castle のせいです。私は正しいですか?キャッスルは本当にその責任を負っていますか?もしそうなら、私の選択肢は何ですか?Castle プロパティを無視するようにシリアライザに指示するにはどうすればよいですか? 特に、実際の型ではなく、定義された型をシリアル化するように指示するにはどうすればよいですか?

この問題に対処するために、ドメイン モデルを ViewModel でカバーする傾向がありますが、これは推奨されるアプローチですが、別の治療法が存在する場合はぜひ知りたいと思っています。

4

1 に答える 1

2

一般に、モデル エンティティをシリアル化することはお勧めできません。
これは、シリアル化してクライアントに送信するものを完全に制御したいためです。
モデルエンティティをシリアル化すると、それらに関連付けられたオブジェクトグラフ全体がシリアル化される可能性がありますが、これは必ずしも必要/必要ではありません。
(たとえば、ユーザーにエンティティのみを表示させたい場合は、エンティティとそのコレクションなど Model1も送信する可能性があります。)Model2Model3

これに対処する標準的な方法は、表示したいものを正確に表示するように適合された、ある種の DTO を使用することです。例えば:

public class Model1DTO
{
   public int Id;
   public string Name;
   public string Model2Name;
   //whatever other properties you need to display
}
于 2011-07-13T05:23:17.960 に答える