我实际上成功地使用了通用请求/响应。
诀窍是将封闭的通用请求/响应注册为已知类型。为了实现这一点,我使用以下约定:
- 通用请求/响应只能有一个通用参数
- 该泛型参数应该有一个泛型约束,指定它应该实现给定的接口
我正在使用这个约定来构造我将用作请求或响应的每个可能的封闭泛型类型。例如,我可以有这样的东西:
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 部分,并且运行良好。