前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WCF入门 (13)

WCF入门 (13)

作者头像
_淡定_
发布2018-08-24 10:54:06
2900
发布2018-08-24 10:54:06
举报
文章被收录于专栏:dotnet & javadotnet & java

前言

  公司略无聊,周三前同事推荐跳槽,于是会去更新了一下简历,突然发现,快一年了,我竟然想不出我可以往简历上添加点什么值得自豪的东西。下午和小伙伴聊了一会天,他告诉我,可以往简历上写上“英语口语水平有提高”,惭愧。。。

  希望自己跳槽成功。

  言归正传,几天第13集。

第13集 ExtensionDataObject in WCF WCF里的ExtensionDataObject

  这集讲的是WCF里面的ExtenstionDataObject。 简单来说, ExtenstionDataObject用来保存DataContacts在序列化和反序列化时候的未知的元素。在服务端,当服务端接收到来自客户端的未知元素内容时,这些内容会被存在ExtenstionDataObject里面。在往客户端发送数据的时候,服务必须把数据序列化为XML,这时候服务的序列化进程就会取出ExtensionDataObject里面的内容,然后把他们序列化到XML里面一起发送给客户端。

  下面我们通过一个例子来解释说明一下。

1。 我们来看一下修改过的Employee DataContract类。

    [DataContract]
    public class Employee : IExtensibleDataObject
    {
        [DataMember(IsRequired = true)]
        public int Id { get; set; }
        //[DataMember(IsRequired = false)]
        //public String Name { get; set; }
        [DataMember]
        public Boolean Gender { get; set; }
        [DataMember]
        public DateTime DateOfBirth { get; set; }
        [DataMember]
        public short EmployeeType { get; set; }
        [DataMember(IsRequired = true)]
        public string City { get; set; }

        public ExtensionDataObject ExtensionData { get; set; }
    }

这里有两点改变,①注释了一个属性Name,②DataContract类实现了IExtensibleDataObject接口,这个接口里定义了一个属性,ExtensionData属性。

因为拿掉了Gender属性,GetEmployee 和 SaveEmployee方法,以及存储过程要稍作修改。这里不说明了。

2。 然后我们把服务端Run起来。

微信截图_20150926202937
微信截图_20150926202937

3。 再把客户端Run起来。

先看看我们数据库里有多少数据:

微信截图_20150926203346
微信截图_20150926203346

总共一条。

然后运行一下客户端的查找方法。

微信截图_20150926204328
微信截图_20150926204328

因为Name属性被注释了,所以从查找出来的结果Name的textbox为空。

3。 下面我们新保存一个Employee。

微信截图_20150926204547
微信截图_20150926204547

如图显示保存成功,但是很明显,数据库里面的Name一定是Null。

微信截图_20150926204702
微信截图_20150926204702

这个Name的Value消失了,如果我们想再获取这个Name的Value,我们应该怎么做? 下面今天的主角登场。 我们来对代码做一些修改。

4。 首先我们对EmployeeService增加一个lastSavedEmployee内部变量。

private static Employee lastSavedEmployee;

这个用来保存最近一次保存的Employee实力。

5。然后是SaveEmployee方法,只需加一句话。

        public bool SaveEmployee(Employee emp)
        {
            lastSavedEmployee = emp;
            var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
            using(var conn = new SqlConnection(connStr)) {
                conn.Open();
                var cmd = conn.CreateCommand();
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "spSaveEmployee";
                cmd.Parameters.Add(new SqlParameter("id", emp.Id));
                //cmd.Parameters.Add(new SqlParameter("name", emp.Name));
                cmd.Parameters.Add(new SqlParameter("gender", emp.Gender));
                cmd.Parameters.Add(new SqlParameter("dateOfBirth", emp.DateOfBirth));
                cmd.Parameters.Add(new SqlParameter("employeeType", emp.EmployeeType));
                return cmd.ExecuteNonQuery() == 1;
            }
        }

就第一句,每次在save的时候都把lastSavedEmployee更新为传入的emp(这里默认每次都是保存成功的 o(∩_∩)o )

6。 然后是GetEmployee方法,

        public Employee GetEmployeeById(int id)
        {
            var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
            using(var conn = new SqlConnection(connStr)) {
                conn.Open();
                var cmd = conn.CreateCommand();
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "spGetEmployeeById";
                cmd.Parameters.Add(new SqlParameter("id", id));

                Employee emp = null;
                var reader = cmd.ExecuteReader();
                emp = reader.HasRows ? new Employee() : null;
                while(reader.Read()) {
                    emp.Id = Convert.ToInt32(reader["Id"]);
                    //emp.Name = Convert.ToString(reader["Name"]);
                    emp.Gender = Convert.ToBoolean(reader["Gender"]);
                    emp.DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]);
                    emp.EmployeeType = Convert.ToInt16(reader["EmployeeType"]);
                }
                if(lastSavedEmployee != null && lastSavedEmployee.Id == id) {
                    emp.ExtensionData = lastSavedEmployee.ExtensionData;
                }
                return emp;
            }
        }

我们来看一下return前面的那个if语句块, 如果lastSavedEmployee不为空,并且lastSaveEmployee的id和传入的id是同一个,那么就复制return的emp的ExtenstionData属性为lastSavedEmployee的ExtentionData属性。

我们来做个测试。按下图保存一个Employee。

微信截图_20150926211003
微信截图_20150926211003

然后在SaveEmployee里面的第一句给lastSavedEmployee句子打个断点。添加一个监视,来看看我们可以拿到什么。

微信截图_20150926205853
微信截图_20150926205853

展开ExtentionData属性,里面有个Members属性,是个集合。Name为“Name”,Value为“TestName”,也就是我们输入的值。

点击保存,提示保存成功,check一下数据库里面的值。

微信截图_20150926211505
微信截图_20150926211505

Name为Null。

7。然后我们调用一下查找方法。

输入Id=3.

微信截图_20150926211627
微信截图_20150926211627

可以看到,TestName这个值虽然没有存入数据库,但还是被Preserve下来了。

这集介绍了IExtensibleDataObject接口,因为本身也没有太多WCF项目的经验,所以暂时也不晓得这个东西在什么业务场景下比较给力。希望有经验的同学给举个好点的例子。

Thank you。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-09-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 第13集 ExtensionDataObject in WCF WCF里的ExtensionDataObject
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档