有谁知道为什么我不能这样做?
public class CreateScenarioHandler :
GL.RRSL.RequestHandler<CommandRequest<ScenarioProfileData>,
CommandResponse<ScenarioProfileData>>
为什么Agatha无法确定通用请求的类型。它在那里定义。 ?
类型'GL.RequestResponse.CommandRequest`1 [T]'无法导出为架构类型,因为它是一个开放的泛型类型。如果所有通用参数类型都是实际类型,则只能导出泛型类型。
如何做到这一点的任何想法。必须为每种类型的操作创建请求对象是非常有限的。
答案 0 :(得分:2)
我实际上已成功使用通用请求/响应。
诀窍是将已关闭的通用请求/响应注册为已知类型。 为了实现这一点,我使用以下约定:
我正在使用此约定来构造每个可能的封闭泛型类型 我将作为请求或响应使用。 例如,我可以这样:
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类型注册为 known-type,允许我使用处理程序处理该请求 像这样的层次结构:
public abstract class GetEntityHandler<TEntity, TDto> :
RequestHandler<GetEntityRequest<TDto>, GetEntityResponse<TDto>>
{
...
}
public class GetUserHandler : GetEntityHandler<User, UserDto>
{
}
我正在将这种方法用于应用程序的CRUD部分,它是 工作得很好。
答案 1 :(得分:0)
这里的问题与如何定义CommandRequest和CommandResponse有关。 Agatha查看扩展请求和响应的类,并将它们添加到WCF中的已知类型。
当服务器启动服务时,WCF会抱怨CommandRequest类型是通用的,不能使用。 WCF如果说它不能声称知道泛型类型。
当我将CommandRequest和CommandResponse定义为abstract时,然后创建类似ScenarioIORequest / Response的类,它们分别使用要包装的apropiate类型扩展CommandRequest和CommandResponse,WCF不会抱怨。
当我希望为不同的DTO提供通用请求和响应时,我必须定义特定类型。也许这会在某些时候发生变化,但它会成为WCF问题而不是Agatha项目问题。