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控件是最常用的(特别对于数据库程序),以下是笔者在 ...
随机推荐
- 【tomcat】启动报错:Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"] java.lang.Exception: Socket bind failed 和java.net.BindException: Address already in use: JVM_Bind错误解决
背景:[新手] 将开发机子上的Tomcat连同其中的项目,一起拷贝到服务器上,启动tomcat的start.bat,然后报错如下: 问题1: Failed to initialize end poin ...
- Oracle表的查询(一)
表查询关键字.字段.表名不加引号时不区分大小写引号定义的内容区分大小写运算中有null值时,结果为null*nvl(字段,赋值):如果字段值为null,则取后面一个值*like 关键字:%表示若干个字 ...
- 清除chrome浏览器HSTS缓存
如果你的网站启用了HSTS 在chrome中会用缓存效果,即使你的站点取消了HSTS,下次访问时,仍旧会自动给你重定向到HSTS. 那么如何清除 HSTS呢? chrome://net-interna ...
- saliency 2015-2016的论文、代码
https://github.com/ArcherFMY/Paper_Reading_List 另外2013年之前的见chengmingming的benchmark主页.
- elasticsearch index tuning
一.扩容 tag_server当前使用ElasticSearch版本为5.6,此版本单个index的分片是固定的,一旦创建后不能更改. 1.扩容方法1,不适 ES6.1支持split index功能, ...
- 无重复字符的最长子串-LeetCode-第3题-C++
题目:无重复字符的最长子串 题目描述:给定一个字符串,找出不含有重复字符的最长子串的长度. 最长不重复子串可能有很多个,但是其长度只有一种. 方法一:暴力搜索法 方法二:滑动窗口 哈希表:要查找一个元 ...
- python在图片上画矩形
python在图片上画矩形 image_path = '' image = cv2.imread(image_path) first_point = (100, 100) last_point = ( ...
- Windows下安装pymssql
准备用Python接入Sql Server数据库,因此准备用pymssql模块. 安装有点纠结. 64位win10系统,python3.6 步骤: 首先需要配置一下freetds: 在这里下载:htt ...
- webpack中hash、chunkhash、contenthash区别
webpack中对于输出文件名可以有三种hash值: 1. hash 2. chunkhash 3. contenthash 这三者有什么区别呢? hash 如果都使用hash的话,因为这是工程级别的 ...
- C语言指针入门
指针指包含地址 声明指针: int num:声明整数 int *num:声明指针,下面的声明也是等价的,空格的使用指示个人爱好 int* num; int * num; int *num; in ...