2011-04-07 18 views
0

有誰知道我爲什麼不能這樣做?agatha的通用要求

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

爲什麼Agatha無法弄清楚通用請求的類型。它是在那裏定義的。 ?

類型'GL.RequestResponse.CommandRequest`1 [T]'不能作爲模式類型導出,因爲它是一個開放的泛型類型。如果所有泛型參數類型都是實際類型,則只能導出泛型類型。

任何想法如何做到這一點。這對於必須爲每種類型的操作創建一個請求對象都是很有限制的。

回答

0

這裏的問題與如何定義CommandRequest和CommandResponse有關。 Agatha查看擴展Request和Response的類並將它們添加到WCF中的已知類型。

當服務器啓動服務時,WCF抱怨CommandRequest類型是通用的並且不能使用。 WCF如果說它不能聲稱知道一個泛型類型。

當我將CommandRequest和CommandResponse定義爲抽象類,然後創建像ScenarioIORequest/Response這樣的類來分別擴展CommandRequest和CommandResponse以包裝Apropiate類型時,WCF不會抱怨。

當我想要爲不同的DTO提供通用請求和響應時,我必須定義特定類型,這感覺就像是浪費。也許這會在某些時候發生變化,但它會成爲WCF的問題,而不是Agatha項目問題。

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; } 
} 

然後,配置阿加莎的時候,我使用的是像這樣 和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部分使用這種方法,它的工作效果非常好。