1

私は、CQRSを学習し、保守可能なWCFサービスを作成することを目的として、このプロジェクトを開始しました。ただし、WCFに関する一般的な質問がいくつかあります。コマンド/クエリハンドラーコントラクトとハンドラーを追加するたびに、プロジェクトをビルドし、Visual Studioでクライアントのサービス参照を右クリックして、[サービス参照の更新]を選択します。これにより、通常、問題なく新しいコマンド/クエリを操作できます。

ただし、多くの場合、実際にサービス参照全体を削除してから、再度追加する必要があります。これが、このエラーを回避できる唯一の方法です。

パラメータ http://tempuri.org/:queryをシリアル化しようとしたときにエラーが発生しました。InnerExceptionメッセージは「タイプ」Contract.Queries.Countries.GetCountriesStartingWithLetterQueryで、データコントラクト名は「GetCountriesStartingWithLetterQuery:http ://schemas.datacontract.org/2004/07/Contract.Queries.Countries 」でした。DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。詳細については、InnerExceptionを参照してください。

その場合、サービス参照を削除して再度追加しても、新しいコマンド/クエリが機能しないことがあります。既知のタイプが登録されているWCFサービスコードにブレークポイントを追加しようとしても、ヒットすることはありません。新しいコマンド/クエリが既知のタイプとして登録されていないため、サービス参照が失敗しているようです。

このCQRSWCFモデルでサービスを更新する適切な方法は何ですか?ありがとう。


更新1:私の問題はすべて、EFがプロキシオブジェクトを生成し、それらをWCFサービスを介して送信しようとすることから発生します。このサービスはプロキシについては知らず、POCOだけを知っています。

@Peter-私はEF5コードファーストを使用しています。私はすべてのPOCOを別のプロジェクトに持っています。リポジトリパターンを使用して、データベースからエンティティを取得します。countryRepository.GetById(myId)と言うと、POCOではなくプロキシオブジェクトが取得されます。ProxyCreationを無効にすると、POCOが返されますが、それぞれの外部キーIDが入力されている間、ナビゲーションプロパティは常にnullになります。たぶん私はリポジトリから何かを取得するときにnavプロパティに.Includeを使用する必要がありますか?現在コードにアクセスできないため、明日確認する必要があります。

あるいは、AutoMapperについてたくさん読んだことがあります。これを使用して、プロキシオブジェクトをPOCOにマッピングできますか?ただのアイデアですが、それは正しくないようです。


編集2:ValueInjectorを使用して、動的プロキシオブジェクトをPOCOに非常に簡単にマッピングできることがわかりました。その後、問題なくPOCOをネットワーク経由で送信できます。詳細については、この投稿を参照してください。

4

3 に答える 3

3

サービス参照の追加は使用しないでください。チャネルファクトリを使用できますが、サービスリファレンスは使用できません。これは、プロジェクトの追加(またはdll)参照を介してデータとサービス契約をクライアントと共有できることを前提としています。

クライアントへの参照を追加します。次に、チャネルファクトリを構築します。これがMSDの簡単な記事です。方法:ChannelFactoryを使用する

参照を共有できない場合は、Carlos Figueiraの汎用コントラクトリゾルバーWCF拡張性–データコントラクトリゾルバーを実装する方法を確認できます。

編集1:

EFでPOCOパターンを使用して、ナビゲーションプロパティを取得し、EFの詳細から離れることができます。

于 2013-02-04T20:34:33.177 に答える
0

この問題は、Visual Studio のエディット コンティニュ機能が原因である可能性があります。Visual Studio は、WCF サービスを使用して IIS Express または Cassini インスタンスをスピンアップし、最初にアクセスすると、WCF サービスが初期化されます (これは、コンテナーが作成され、GetKnownTypesメソッドが呼び出されたときです)。

ただし、新しい型を追加して再コンパイルすると、Visual Studio は WCF サービスのアセンブリを変更しますが、その AppDomain を再起動せず、Web サービスを初期化したままにします (初期化は 1 回しか行われないため) が、構成が無効になります。

これは、デバッグを開始するたびに IIS Express インスタンスを強制終了することで解決できますが、もちろんこれは非常に面倒です。おそらくこれを自動化できますが、編集して続行する必要がないため、少なくとも本番環境では問題が発生することはありません。

現在、私は通常、コマンドとクエリを WCF コントラクトの一部として公開していません。クライアントとサーバーは JSON オブジェクトを送受信するだけですが、WCF サービスが関係するのは単なる文字列です。JSON を回線経由で送信することは、私にとって非常に有益であることが証明されています。その理由は次のとおりです。

  • JSON.NET のシリアライザーは、WCF の SoapSerializer よりもはるかに柔軟です (これはまったくの苦痛です)。JSON.NET は、不変オブジェクト、コレクション、辞書など、必要なものすべてをシリアル化/逆シリアル化できます。
  • WCF コントラクトの一部としてコマンド オブジェクトとクエリ オブジェクトを公開しないことで、完全なエディット アンド コンティニュの問題が完全に解消されます。
于 2013-06-12T20:59:00.693 に答える
0

ネットワーク経由でエンティティを送信することは想定されていません。代わりに、サービス メソッドに固有の DTO/メッセージ オブジェクトを作成し、それらをサービス内のエンティティとの間でマッピングします。

于 2013-02-27T17:15:06.053 に答える