0

さまざまなオブジェクトのコレクションに複数の型を実装する必要がないように、GenericDataContractクラスを使用しようとしています。

Exp:

オブジェクトのコレクションを含むProfileオブジェクトがあります。

そのため、プロファイルにFooまたはFoo1オブジェクトのコレクションが含まれているものがProfile<Foo>必要Profile<Foo1>です。

WCFはジェネリッククラスをサポートしていないことを読んでいますが、実際に発生するエラーは次のとおりです。

Type 'GL.RequestResponse.ProfileResponse1 [T]'はオープンジェネリック型であるため、スキーマ型としてエクスポートできません。ジェネリック型は、すべてのジェネリックパラメータ型が実際の型である場合にのみエクスポートできます。

これで、ProfileResponseは、私が使用しようとしているこのProfileオブジェクトです。

今私のホストで私は次のことをしています。:

 ServiceConfig(typeof(ProfileHandler<EducationResponse>).Assembly, 
               typeof(ProfileRequest).Assembly,
               typeof(Container)).Initialize();

これは、データコントラクトを使用したハンドラーの定義です。

   public class ProfileHandler<T> : RequestHandler<ProfileRequest,
                                                   ProfileResponse<T>> 

コンテナはWindsorContainerを使用してオブジェクトを登録しています。

登録は正常に機能しますが、WCFプロセッサのサービスホストをインスタンス化し、ホストのOpen Methodを呼び出すと、上記のエラーが発生します。

agathaを使用してwcfの一般的な応答要求を作成する方法は本当にありませんか?そのコレクションに含まれるタイプごとにProfileコンテナークラスを定義する必要があるのは、このような無駄のように感じます。

ありがとう。

4

1 に答える 1

0

サーバー側はタイプが何であるかを知る必要があるため、ジェネリックハンドラーを開くことはできません。いわゆるクローズドジェネリックメソッドを使用できます。このようにして、サーバー側はwitchがハンドラーをロードするためのタイプを認識します。

また、リクエストに関連する追加情報を受信できるようにAgathaを構成できる可能性もあります。この場合、それは応答でラップされたタイプになります。

BaseRequestクラスを定義し、すべてのリクエストでこのクラスを拡張することで、これを行うことができます。このクラスは、応答のタイプを受け取るプロパティを持つことができます。または、応答でラップされるタイプ。

プロセスでは、リクエストを調べるときに、プロセスが応答でラップされるタイプを取得できるため、クラスをロードする方法がわかります。

時間がかかりすぎて、アプリケーションのAgathaを維持する責任があるかどうかわからないため、これを実装していませんが、これが私が行う方法です。

于 2011-04-08T20:14:38.230 に答える