1

有谁知道为什么我不能这样做?

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

为什么 Agatha 无法确定通用请求的类型。它在那里定义。?

类型 'GL.RequestResponse.CommandRequest`1[T]' 不能导出为模式类型,因为它是开放的泛型类型。如果所有泛型参数类型都是实际类型,则只能导出泛型类型。

关于如何做到这一点的任何想法。必须为每种类型的操作创建一个请求对象感觉非常有限制。

4

2 回答 2

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 类型注册为已知类型,并允许我使用如下处理程序层次结构处理该请求:

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 进行通用请求和响应时,我必须定义特定类型,这感觉像是一种浪费。也许这会在某个时候改变,但它似乎是 WCF 问题而不是 Agatha 项目问题。

于 2011-04-08T20:21:33.610 回答