[转]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!
转载原文:http://www.cnblogs.com/lemontea/archive/2013/01/18/2865686.html
[转]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 ...
- Python的数字类型及其技巧
Python中的数字类型 int float fractions.Fraction decimal.Decimal 数字的舍与入 int(f):舍去小数部分,只保留整数部分,所以int(-3.8)的结 ...
- 关于C#中的DateTime类型的技巧
* datetime.now.tostring()方法默认的你是无法得到全部的时间的格式的,只能得到日期,得不到具体时间,如果要具体时间,就应该使用 datetime的tostring()重载,dat ...
- struct 类型指针技巧
此类型对于两种结构的查找和删除都十分方便,实际项目中也常常用到.
- Elasticsearch Date类型使用技巧
elasticsearch原生支持date类型.这里简单记录下使用的方法. 使用date类型可以用如下两种方式: 使用毫秒的时间戳,直接将毫秒值传入即可. 传入格式化的字符串,默认是ISO 8601标 ...
- C语言两个特别大的整数类型相加超出范围使用两个技巧
技巧1:用long (%ld)或者long long(%lld)类型存取 技巧2:当两个同号的数字相加,放到等号的另一边,变成减号 问题: 给定区间[-2的31次方, 2的31次方]内的3个整数A.B ...
随机推荐
- tcpdump-根据IP查看程序与服务都用了哪些端口
tcpdump -i em1 -tttt src 116.3.248.157 and port ! 6869 -nn -i 指定端口 -tttt 附带时间戳 -nn 解析域名与端口信息 ####### ...
- ASP.NET Page执行顺序如:OnPreInit()、OnInit()
http://www.cnblogs.com/yeminglong/archive/2012/10/16/2725664.html 当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺 ...
- php之快速入门学习-4(数据类型)
PHP 5 数据类型 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值). PHP ...
- [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图: 小鱼儿 由于整个绘制分析过程比较繁琐所以 ...
- crontab 格式
- oracle卸载清除注册表(彻底卸载)
用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢? 那就是直接注册表清除,步骤如下: . 开始->设置->控制面板-& ...
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识
2013-02-05 14:18 48人阅读 评论(0) 收藏 举报 关键字: Unicode, Character Set, 字符集, UTF-8, ANSI, ASCII, UTF-7 ...
- WIFI物联网平台微信端开发分享
本文由企鹅圈原创成员Hunter_Zhu贡献. 本篇文章是基于近期一个项目微信端开发过程的一个总结.文中主要介绍了云智易平台下微信端开发的流程.该平台提供的主要功能以及此次H5开发使用到的一些UI组件 ...
- Android API之java.lang.String
boolean java.lang.String.contains(CharSequence cs) String字符串是否包含CharSequence(cs).
- 转:【HTTP】常见错误码说明
一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 ...