使用Svcutil生成的类名称给出了问题

时间:2011-03-15 05:21:27

标签: wcf svcutil.exe

我正在尝试从业务层服务在表示层中生成代理..

我的问题是我有两个具有相同名称的类,但是在不同的名称空间中。

说,Business.AddressInfo和Data.AddressInfo

生成的代理将Business中的AddressInfo更改为AddressInfo1。

我该如何控制它?

1 个答案:

答案 0 :(得分:4)

这是标准的WCF行为,无法“控制” - 这就是它的工作方式。

当WCF运行时/ svcutil执行“添加服务引用”时,它会读取服务文档(WSDL,XSD),并从这些描述中构建客户端代理 - 两者都是服务代理(使用调用方法的方法)服务)和客户端数据表示。

WCF客户端和服务共享的唯一内容是线上数据的表示 - 例如客户端代理数据类将序列化为与服务器端类相同的XML格式。毕竟:WCF是一个消息传递系统 - 除了客户端和服务器之间的序列化消息之外没有任何连接。

这些客户端代理类生成到您选择的命名空间中 - 您可以控制它,但它们将始终是单独命名空间中的单独类。

基本上有两种方法可以解决这个问题:

  1. 您可以使用AutoMapper之类的内容在需要时在这些类之间进行映射;因为线上的序列化格式是相同的,所以属性名称也是相同的,因此从一种对象类型到另一种对象类型的映射应该非常简单和简单

  2. 如果你控制电线的两端,例如无论是服务器还是客户端,两者都在.NET上,您还可以将所有服务合同,数据合同等放入单独的类库程序集中,然后在服务器和客户端之间共享该程序集。这样,当您执行“添加服务引用”时,WCF运行时将重用已引用的共享程序集中的现有类型,并且它不会再次创建客户端代理类。有了这个“技巧”,您的服务器和客户端将使用来自该公共共享程序集的相同类。