2011-07-13 43 views
3

我知道,当你创建你可以创建一个通用的DataContract服务:是否可以从客户端使用通用DataContract?

[DataContract(Name = "Get{0}Request") 
public sealed class GetItemRequest<T> 
    where T : class, new() { ... } 

[DataContract(Name = "Get{0}Response") 
public sealed class GetItemResponse<T> 
    where T : class, new() { ... } 

[ServiceContract] 
public void MyService : IMyService 
{ 
    [OperationContract] 
    GetItemResponse<Foo> GetItem(GetItemRequest<Foo> request); 
} 

这生成WSDL我一个GetFooRequestGetFooResponse定义。现在,我很好奇的是,如果有可能走向另一个方向?

是否有可能创建一个使用通用DataContracts并通过这些服务器作为一个具体的对象的客户?我在添加Service Reference之后尝试了这一点,但实际上效果并不好。所以这更多的是我想知道是否有任何方式(即使它不需要添加服务引用)来执行此操作?

+0

我承认,这个功能(如描述在这里MSDN(http://msdn.microsoft.com/en-us/library/ms731045.aspx))是*不*一个我以前见过。有趣。 –

+0

@Marc:是的,但它只是一半有用。负责“ServiceContract”和“OperationContract”类的另一个团队在生成Name值时松开关闭,并且不对DataContract执行的泛型进行很好的检查,因此为什么不能创建具体定义的泛型操作/服务合同!也许C#5? :) –

回答

3

最终,WCF将查看合同类。如果这是从WSDL/MEX生成的,它不会有这个(因为这不是它在元数据中的表达方式) - 但是如果你的客户端具有上面的代码,那么确定它应该可以正常工作。

如果添加参考(即一个DLL /项目引用)从客户端的DTO的DLL,并确保WCF,使共享组件,它应该工作。如果它仍然阻止,那么作弊:使用服务参考只是为了获取配置数据。然后删除服务引用,但保留配置(否则这些配置文件是一种痛苦)。然后它应该找到库中的类型。

+0

我想我找出了我的问题。泛型类位于自己的名称空间MyNamespace.Common中,具体定义在不同的名称空间MyNamespace.Services.XService中生成。因此,在客户端,我仍然将泛型类放在一个'MyNamespace.Common'定义中,因此我没有使用正确名称空间中的具体定义。基本上,它没有我想象的那么有用,因为我仍然需要创建一个具体类型'GetFooRequest:GetItemRequest ',为它添加一个DataContract属性(所以我也可以添加Name/Namespace)。 –

+0

看起来,即使可能,从客户端到服务器看起来并不像从服务器到客户端那样有用。我将不得不多玩这个。 –

相关问题