0

コントローラーがEF 5.0エンティティのリポジトリを使用するビジネスレイヤーを呼び出すWCFサービスレイヤーを呼び出すASP.NET MVC 4プロジェクトがあります。次に、結果が POCO エンティティとしてコントローラーに返されます。

WCF サービスがライブラリとして直接参照されている間は問題なく動作しますが、シリアル化する必要があるため、サービスとして参照されていると動作しないことがわかっています。ProxyCreation を有効にすると、これは不可能です。

生成された POCO エンティティを使用しているため、DTO を作成したくありません。POCOエンティティがサービスレイヤーに到達する前にのみ変更を追跡したい.

多くの人が、POCO と同じ場合でも DTO を使用することについて話します。そうすると、自動生成されたコピーされたクラスを名前が異なるだけで作成して、「DTO としてのプロキシ無効 POCO」になる可能性があります。 .

サービス層から返されたときにオブジェクトをシリアル化できるように、POCO のプロキシ クラスを強制終了できますか?

また、このアイデアが良い習慣であるかどうかもわかりません。しかし、「クリーンな」エンティティをコントローラーに送信して、ViewModel にマップする準備ができたら素晴らしいと思います。パフォーマンスも求めています。

4

2 に答える 2

1

問題はProxyDataContractResolverを使用して解決されます。私たちも使わなければなりませ[Serializable] and [DataContract(IsReference=true)]ん。この組み合わせにより、ProxyCreation を有効にすることができます。

于 2012-11-30T17:52:46.080 に答える
0

これを処理する方法は、次のことでした。

  1. 属性で装飾されたクラスを生成するように、POCO クラスを生成する T4 をカスタマイズし [Serializable()] and [DataContract(IsReference=true)]ます。
  2. フロントエンド (ビュー) とバックエンド (wcf サービス/ビジネス レイヤー) の両方が POCO 生成クラスを参照します。これは、IsReference=true によりプロキシを使用しないためです。

基本的にはそれだけです。

これにより、DTO を作成する必要がなくなり、バックエンドとフロントエンドの両方で POCO クラスを使用するだけです。

ただし、IsReference=true ハンドルを使用する WCF は冗長なオブジェクトを好まないことに注意してください (したがって、これは、ナビゲーション プロパティを持つ一部の POCO クラスで問題になります)。

于 2012-11-29T05:24:08.607 に答える