连接Web服务客户端和映射实体

时间:2012-06-06 10:12:51

标签: c# wcf interface mapping service-reference

我有以下(简化)方案。

有一个WCF服务(MyService),它公开了一些实体MyEntityDTO。在客户端,我创建了一个接口IMyServiceClient,它被传递给我的客户端组件,因此他们可以从任何底层实现请求MyEntityDTO。而且现在我可以使用一些MockedMyServiceClient运行客户端单元测试:IMyServiceClient。到目前为止似乎很好。

现在我已经创建了一个实际的MyRealWCFServiceClient:IMyServiceClient,它基本上只包装了Visual Studio创建的WCF服务引用。

一个问题是WCF服务引用返回另一种MyEntityDTO,因此我必须将它从服务引用实体类型映射到从IMyServiceClient返回的MyEntityDTO类型。我可以使用AutoMapper。

但这是最大的问题。比方说,我想在我的项目中的其他一些应用程序中重用MyRealWCFServiceClient。如果这些应用程序中的每一个都拥有自己的WCF服务引用及其自己的DTO类型,我将不得不以某种方式传递当前服务引用的所有DTO类型,并使用一些棘手的反射来配置AutoMapper以将我的Generic类型注入其中。多么糟糕......

但是我可以在一些公共库中使用它们包装MyRealWCFServiceClients来收集我的常见WCF引用,因此所有MyRealWCFServiceClients都只使用那些已知的常见WCF引用。

我想知道,为服务引用创建公共库是一个好习惯吗?对此有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果您创建一个公共客户端,那么我会将其创建为从服务端发布的可分发程序集。换句话说,创建一个公共客户端然后分发。不要从客户端构建代理。

至于生成不同代理(对于DTO)的事实,如果您可以引用包含DTO实现的合同程序集。然后使用VS构建代理,代理生成器足够智能,可以使用引用的原始DataContracts(而不是生成新的代理类)。

所以,我认为你有两个选择。一,创建一个普通客户的项目,然后分发它。和/或两个,在生成客户端之前引用合同程序集目录。

希望这有帮助。