对agatha的一般要求

时间:2011-04-07 22:12:57

标签: wcf agatha-rrsl

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

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

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

  

类型'GL.RequestResponse.CommandRequest`1 [T]'无法导出为架构类型,因为它是一个开放的泛型类型。如果所有通用参数类型都是实际类型,则只能导出泛型类型。

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

2 个答案:

答案 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项目问题。