【发布时间】:2011-03-15 13:54:40
【问题描述】:
我正在尝试从业务层服务在表示层中生成代理..
我的问题是我有两个具有相同名称的类被公开,尽管它们位于不同的命名空间中。
比如说,Business.AddressInfo 和 Data.AddressInfo
生成的代理将 Business 中的 AddressInfo 更改为 AddressInfo1。
如何控制它?
【问题讨论】:
标签: wcf svcutil.exe
我正在尝试从业务层服务在表示层中生成代理..
我的问题是我有两个具有相同名称的类被公开,尽管它们位于不同的命名空间中。
比如说,Business.AddressInfo 和 Data.AddressInfo
生成的代理将 Business 中的 AddressInfo 更改为 AddressInfo1。
如何控制它?
【问题讨论】:
标签: wcf svcutil.exe
这是标准的 WCF 行为,无法“控制” - 这就是它的工作方式。
当 WCF 运行时/svcutil 执行“添加服务引用”时,它会读取服务文档(WSDL、XSD)并从这些描述中构建客户端代理 - 两者都是服务代理(使用调用服务)和客户端数据表示。
WCF 客户端和服务共享的唯一内容是数据在网络上的表示 - 例如。客户端代理数据类将序列化为与服务器端类相同的 XML 格式。毕竟:WCF 是一个消息传递系统 - 除了客户端和服务器之间的序列化消息之外没有其他连接。
这些客户端代理类会生成到您选择的命名空间中 - 您可以控制这一点,但它们始终是单独命名空间中的单独类。
基本上有两种处理方法:
您可以在需要时使用AutoMapper 之类的东西在这些类之间进行映射;由于线路上的序列化格式相同,属性名称也相同,因此从一种对象类型映射到另一种对象类型应该非常直接和简单
如果您控制电线的两端,例如服务器和客户端都在 .NET 上,您还可以将所有服务合同、数据合同等放入单独的类库程序集中,然后在服务器和客户端之间共享该程序集。这样,当您执行“添加服务引用”时,WCF 运行时将重新使用被引用的共享程序集中的现有类型,并且不会再次创建客户端代理类。有了这个“技巧”,您的服务器和客户端都将使用来自该通用共享程序集的相同类。
【讨论】: