WCF类型共享技巧【转载】
调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不同的类型,Service1获得的User是放不到Service2服务里去的。手动的属性赋值来转换显然是不可取的,所以就共享类型了。
方法1,服务端和客户端共享数据契约程序集。
这个方法最常用,也是大家最熟悉的方法,把WCF的数据契约放在一个独立类库里,服务端,客户端都引用这个程序集,然后在生成WCF时,选择重新使用引用程序集中的类型即可。

这个方法缺点很明显,它只有在客户端和服务端在同一个Visual Studio解决方案内才方便,否则要不断手动更新数据契约程序集。更不用说是第三方的服务。
方法二,暴力转换类型
这个其实不是类型共享,不过也是解决这个问题的一种手段。就是借助AutoMapper,EmitMapper这样的类库帮助快速转换类型。下面是一个例子。
Money类型包含User实体和Currency枚举和一个数字的Amount,Money的定义
[DataContract(Namespace = Consts.Namespace)]
public class Money
{
[DataMember]
public decimal Amount { get; set; }
[DataMember]
public Currency Currency { get; set; }
[DataMember]
public UserInfo User { get; set; }
}
Currency:
[DataContract(Namespace = Consts.Namespace)]
public enum Currency
{
[EnumMember]
Euro,
[EnumMember]
Usd,
[EnumMember]
PoundSterling
}
UserInfo:
[DataContract(Namespace = Consts.Namespace)]
public class UserInfo
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public string Phone { get; set; }
[DataMember]
public string Id { get; set; }
}
对于DepositServiceNoSharp和WithdrawalServiceNoSharp这两个WCF服务版本的Money和User,可以这样添加一些扩展方法
using AutoMapper;
using DepositService = Client.DepositServiceNoSharp;
using Client.WithdrawalServiceNoSharp;
namespace Client {
public static class Extensions
{
static Extensions()
{
Mapper.CreateMap<DepositService.Money, Money>();
Mapper.CreateMap<Money, DepositService.Money>();
Mapper.CreateMap<DepositService.UserInfo, UserInfo>();
Mapper.CreateMap<UserInfo, DepositService.UserInfo>();
}
public static Money ToWithdrawal(this DepositService.Money money)
{
return Mapper.Map<DepositService.Money, Money>(money);
}
public static DepositService.Money ToDeposit(this Money money)
{
return Mapper.Map<Money, DepositService.Money>(money);
}
}
}
然后就可以轻松转换
var money = new Money {
Amount = 1,
Currency = Currency.Usd,
User = new UserInfo {
Email = "zhww@outlook.com",
FirstName = "zhang",
Id = "123",
LastName = "weiwen",
Phone = "110"
}
};
var depositMoney = money.ToDeposit();
方法三,使用SvcMap实现类型共享
其实这个才是文章的重点,前面可以忽略。
生成第一个WCF服务后,点击”显示所有文件“去编辑SvcMap文件:

找到MetadataSources节点,原来只有一个,现在把其他要引用的服务添加到这里,例如:
<MetadataSources>
<MetadataSource Address="http://localhost:34875/DepositService.svc" Protocol="http" SourceId="1" />
<MetadataSource Address="http://localhost:34875/WithdrawalService.svc" Protocol="http" SourceId="2" />
</MetadataSources>
再右击服务,”更新服务引用“,所有服务都会生成到同一个命名空间里,实现类型共享。
最后感谢原作者,原文链接。
还有顺道向微软出示一下中指,把这个功能隐藏得这么深。
The End!
WCF类型共享技巧【转载】的更多相关文章
- [转]WCF类型共享技巧
调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不 ...
- WCF服务编程中使用SvcMap实现类型共享等技巧【转】
原文链接:http://www.cr173.com/html/19026_1.html 国外的一篇文章:Sharing DataContracts between WCF Services 文中提到的 ...
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇] 在<上篇>中,我通过使用Delegate的方式解决了服务调用过程中的异常处理以及对服务代理的关闭.对于<WCF技术 ...
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] 在进行基于会话信道的WCF服务调用中,由于受到并发信道数量的限制,我们需要及时的关闭信道:当遇到某些异常,我们需要强行中止(Abor ...
- Linux使用笔记: 使用Samba访问windows的共享目录(转载)
转自:http://easwy.com/blog/archives/mount-a-windows-shared-folder-on-linux-with-samba/ 通常我们使用Samba都是在W ...
- 常用MIME类型(Flv,Mp4的mime类型设置)(转载)
转载地址:http://www.cuplayer.com/player/Help/2011/0625/83.html 也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过htt ...
- GJM : Unity3D - UI - UI边缘流光特效小技巧 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 创建和导出SVG的技巧(转载)
本文转载自: 创建和导出SVG的技巧
- TextBox使用技巧--转载
[转载出处注明:http://tieba.baidu.com/p/3677706825] 在使用Visual Basic开发应用程序时,TextBox控件是最常用的(特别对于数据库程序),以下是笔者在 ...
随机推荐
- CentOS6.x安装RabbitMQ
一.安装依赖文件 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ ...
- models.doc2vec – Deep learning with paragraph2vec
参考: 用 Doc2Vec 得到文档/段落/句子的向量表达 https://radimrehurek.com/gensim/models/doc2vec.html Gensim Doc2vec Tut ...
- lesson5rnns-fastai
32min 如何确定embedding个数即嵌入矩阵容量?:不确定:与文本的字数关系不大,关键是语言的复杂度和需要解决的问题类型 embedding的效果要比one hot编码的效果好
- ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- nginx实现nginx/tomcat负载均衡
准备三台centos7虚拟机,全部安装nginx或者tomcat 虚拟机A 10.0.3.46 在index.html 中添加10.0.3.46作为标志 虚拟机B 10.0.3.66 ...
- zabbix自定义触发器进行监控
给某一主机创建触发器 触发器属性,其中centos是主机名,也就是你监控的那台主机的名字,可以点击bp2,查看该主机的hostname 检测该触发器 在该主机下可以看到刚创建的触发器 最后我们给该主机 ...
- Dynamic Code Evolution for Java dcevm 原理
在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...
- react-static 基于react 渐进式静态站点生成框架
react-static 是一个不错的基于react 开发的静态站点生成框架,可以用来替代create-react-app 包含的特性 100% react 很快的构建以及性能 自动代码以及数据分离 ...
- 数学沉思录:古今数学思想的发展与演变 (Mario Livio 著)
第1章 神秘的数学 (已看) 发现还是发明 第2章 神秘学:命理学家和哲学家 (已看) 毕达哥拉斯 进入柏拉图的洞穴 第3章 魔法师:大师和异端 (已看) 给我一个支点:我将撬起地球 阿基米德重写稿 ...
- Behavior Designer 学习
http://www.opsive.com/ 简单Demo Sequence Selector Chase Enemy enemy:player: