私は実際に一般的な要求/応答を正常に使用しています。
秘訣は、クローズされた一般的なリクエスト/レスポンスを既知のタイプとして登録することでした。これを実現するために、次の規則を使用しています。
- ジェネリック リクエスト/レスポンスは、ジェネリック パラメータを 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 部分にこのアプローチを使用していますが、非常にうまく機能しています。