1

なぜ私がこれを行うことができないのか誰かが知っていますか?

public class CreateScenarioHandler : 
GL.RRSL.RequestHandler<CommandRequest<ScenarioProfileData>,
                       CommandResponse<ScenarioProfileData>>

Agatha が一般的な Request のタイプを把握できないのはなぜですか。そこで定義されています。?

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

これを行う方法のアイデア。操作の種類ごとにリクエスト オブジェクトを作成する必要があるのは、非常に制限的だと感じます。

4

2 に答える 2

2

私は実際に一般的な要求/応答を正常に使用しています。

秘訣は、クローズされた一般的なリクエスト/レスポンスを既知のタイプとして登録することでした。これを実現するために、次の規則を使用しています。

  • ジェネリック リクエスト/レスポンスは、ジェネリック パラメータを 1 つだけ持つことができます
  • そのジェネリック パラメータには、特定のインターフェイスを実装する必要があることを指定するジェネリック制約が必要です。

この規則を使用して、要求または応答として使用する可能性のあるすべてのクローズ ジェネリック型を構築しています。たとえば、次のようなものがあります。

interface IDtoWithId 
{ 
 int Id { get; } 
} 

public class GetEntityRequest<TDto> : Request where TDto : IDtoWithId 
{ 
   .... 
} 
public class UserDto : IDtoWithId 
{ 
   public int Id { get; set; } 
   public string Name { get; set; } 
} 

次に、Agatha を構成するときに、https ://gist.github.com/916352 のようなものを使用して、次のことを行っています。

.... 
configuration.Initialize(); 
KnownTypeProvider.ClearAllKnownTypes(); 
KnownTypeHelper.RegisterRequestsAndResponses(typeof(UserDto).Assembly);

KnownTypeHelper は、GetEntityRequest 型を既知の型として登録し、次のようなハンドラー階層を使用してその要求を処理できるようにします。

public abstract class GetEntityHandler<TEntity, TDto> : 
RequestHandler<GetEntityRequest<TDto>, GetEntityResponse<TDto>> 
{ 
   ... 
} 

public class GetUserHandler : GetEntityHandler<User, UserDto> 
{ 
} 

アプリケーションの CRUD 部分にこのアプローチを使用していますが、非常にうまく機能しています。

于 2011-12-08T12:11:10.177 に答える
0

ここでの問題は、CommandRequest と CommandResponse の定義方法に関係しています。Agatha は、Request と Response を拡張するクラスを調べて、それらを WCF の既知の型に追加します。

サーバーがサービスを開始すると、WCF は型 CommandRequest が汎用的であり、使用できないことを訴えます。ジェネリック型について知っていると主張できないと言っている場合は、WCF。

CommandRequest と CommandResponse を抽象として定義し、ScenarioIORequest/Response のようなクラスを作成して、CommandRequest と CommandResponse をそれぞれラップする適切な型で拡張すると、WCF は文句を言いません。

さまざまな DTO に対して一般的な要求と応答が必要な場合に、特定の型を定義する必要があるのはもったいないことです。これはいつか変わるかもしれませんが、Agatha プロジェクトの問題ではなく、WCF の問題であると思われます。

于 2011-04-08T20:21:33.610 に答える