WCF服务编程中使用SvcMap实现类型共享等技巧

作者:小菜 更新时间:2025-02-27 点击数:
简介:调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Servic

【菜科解读】

调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不同的类型,Service1获得的User是放不到Service2服务里去的。

手动的属性赋值来转换显然是不可取的,所以就共享类型了。

方法一、服务端和客户端共享数据契约程序集

这个方法最常用,也是大家最熟悉的方法,把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(); Mapper.CreateMap(); Mapper.CreateMap(); Mapper.CreateMap(); public static Money ToWithdrawal(this DepositService.Money money) return Mapper.Map(money); public static DepositService.Money ToDeposit(this Money money) return Mapper.Map(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节点,原来只有一个,现在把其他要引用的服务添加到这里,例如:

再右击服务,”更新服务引用“,所有服务都会生成到同一个命名空间里,实现类型共享。

WCF,服务,编程,中,使用,SvcMap,实现,类型,共享

warframe更新失败内容服务器

warframe更新失败内容服务器?如果你是用的手机热点,那么很容易出现这种问题,因为手机网络监管更严,很容易就碰到墙了,墙的意思也就是阻断国外服务器的意思,今天小编就来聊一聊关于warframe更新失败内容服务器?接下来我们就一起去研究一下吧! warframe更新失败内容服务器如果你是用的手机热点,那么很容易出现这种问题,因为手机网络监管更严,很容易就碰到墙了,墙的意思也就是阻断国外服务器的意思。

解决方法有几种,最一本万逸的方法是买个游戏加速器,这里百度就可以了,游戏中很多人听说你没有加速器是不愿意和你一起玩的,因为没有加速器游戏中很容易掉线,更不用说当房主,给别人做主机了。

如果你觉得太贵,菜叶说说,那也可以科学上网,科学上网不仅可以游戏加速还可以有更好的用途。

这个科学上网什么意思可以百度。

剩下的就是一些不一定成功的方法了。

首先是手机热点,手机热点在当地高峰时段很容易网络不稳定,比如大学寝室下课或者大家都没课的时候。

本来游戏更新的网络要求就特别高了,这个时候就更容易失败,你可以大早上的把游戏登陆挂起。

接着是为了让网络更稳定,将手机通过usb连接到电脑上,然后在个人热点里面选择usb共享网络。

接着是最后一个办法,尝试打通与外网的连接,也就是说进可以在中国浏览的外国服务器网站,这里warframe的官网就是外国服务器。

因为这个网站虽然服务器不在中国但是你尝试连接这个网站的时候他在中国的合作商就会给你转接网络。

另外steam上多浏览下商店随便加载下也有帮助。

西门子plc编程根据要求写?学习SCL语言的基本语法规则

SCL:Structured Control Language,结构化控制语言。

SCL是一种类似于计算机高级语言的编程方式,只是这种语言编写的程序,可以在PLC中运行。

如果学过C语言或者VB语言,就会很容易上手SCL。

当然没有基础依然可以从零开始学习。

在PLC中有了SCL这种编程语言,就可以方便地把计算机高级语言,编写的算法移植到PLC中。

西门子以下系列的PLC都支持SCL语言编程:S7-300S7-400S7-1200S7-1500WinAC SCL能实现复杂的运算功能,特别是有大量数据要处理的时候。

相对于梯形图SCL在运算、函数、过程优化方面有天然的优势。

在博途软件中已经集成SCL语言包,可以直接使用SCL进行进行编程。

在传统的STEP7 中需要单独的安装 S7-SCL 软件包。

因为SCL是一种高级编程语言,所以就包含表达式、运算符、程序控制语句等语言元素。

1、表达式 SCL中有三种表达式:算术表达式关系表达式逻辑表达式 一个完整的表达式是由操作数和与之搭配的操作符组成。

通过表达式的特定顺序进行运算,并返回一个值。

操作数:常数、变量、函数调用(在PLC编程中可以理解为地址)。

操作符: 、- 、、/ (加减乘除),and、or、not(与或非)等。

操作符有时也叫运算符,SCL支持的运算符有算术运算符、比较运算符、逻辑运算符、赋值运算符。

算术运算符:主要是我们常用的加( )、减(-)、乘()、除(/),以及数学上常用的取正、取负、求余数、整除、求余(%)。

比较运算符:用于数值的比较,主要有大于、小于、等于、不等于。

逻辑运算符:用于布尔型值的运算,常用的逻辑运算符除了与、或、非之外,还有异或。

赋值运算符:通过赋值运算,可以将一个表达式的值赋给一个变量。

赋值运算符左侧为变量,右侧为表达式的值。

赋值运算的计算按照从右到左的顺序。

1.1、算术表达式 算术运算符: 、-、、/、DIV、MOD、。

算术表达式通常由常量、变量、函数、圆括号、运算符等组成。

算术表达式也叫数学表达式,是三种表达式中最简单的,几乎可以等同于数学运算。

西门子PLC的算术表达式,支持各种数据类型。

一个算术表达式的两个操作数,如果分别属于不同的数据类型,依然可以运算。

运算结果的数据类型,如下图所示: 虽然不同的数据类型可以算术运算,还是建议大家先进行数据格式转换,然后进行运算。

防止出现运算后,不知道数据格式,导致数据错误。

1.2、关系表达式 关系运算符:=、==、。

关系表达式是利用关系运算符,将两个操作数或数据类型进行比较,然后得到一个布尔值(BOOL)型的逻辑结果。

如果比较结果为真,菜叶说说,则结果为1(TRUE),否则为0 (FALSE)。

所以关系表达式的值只能是逻辑值真或假(1或者0)。

关系表达式有时候也称作比较表达式。

西门子PLC的关系表达式,支持各种数据类型,结果的数据类型只能是布尔型。

以下数据类型,只能比较相同类型的变量: TIME日期和时间UDT 1.3、逻辑表达式 逻辑运算符:AND(&)、OR、NOT、XOR。

西门子PLC的逻辑表达式,支持各种数据类型。

但是在运算中会出现两种情况。

一是,两个操作数都是布尔(BOOL)数据类型,则逻辑运算的结果也为布尔数据类型。

另一种情况,如果两个操作数中至少有一个是位序列,则结果也为位序列。

结果由最高操作数的数据类型决定。

例如,当两个操作数分别是字节(Byte) 类型和字(Word)类型时,结果为字(Word)类型。

逻辑表达式中一个操作数为布尔(BOOL)类型而另一个为位序列时,必须先将 布尔(BOOL)类型的操作数显式转换为位序列类型。

#p#分页标题#e# 位序列:一组由0和1组成的序列。

加入收藏
               

WCF服务编程中使用SvcMap实现类型共享等技巧

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录