Different ways of associating known types in wcf

  

  解释一下这个博客Known Types此属性标签,假设翻译的单词,所谓已知类型它。在服务契约中实现多态的行为。有四种方式实现,以下来分别演示一下。


  1.User KnownType attribute on the base type.

      这样的方式是针对于全局的。假设採用这样的方式后,全局的服务契约和全部的方法契约将都会默认加上此种方式。

      员工类

    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace EmployeeService
{
    [KnownType(typeof(FullTimeEmployee))]
   [DataContract(Namespace="http://Employee/employee")]
    public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Name="id",Order=1)]
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }


        [DataMember(Name = "Name", Order = 2)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        [DataMember(Name = "Gender", Order = 2)]
        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public DateTime DateOfBirth
        {
            set { _dateOfBirth = value; }
            get { return _dateOfBirth; }
        }

    }
}


  全职员工类。继承自基类

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace EmployeeService
{
    [DataContract]
    public class FullTimeEmployee:Employee
    {
        public int AnnualSalary { set; get; }
    }
}

  上述中FullTimeEmployee继承自Employee,此时假设在Employee上增加 [KnownType(typeof(FullTimeEmployee))]标签后,client也就会看到FullTimeEmployee


  2.Apply ServiceKnownType attribute on the service contract.

     另外一种方式是,直接把此标签加入到服务契约上,那么此时。仅仅有此服务契约共享该契约实体

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace EmployeeService
{
    // 注意: 使用“重构”菜单上的“重命名”命令,能够同一时候更改代码和配置文件里的接口名“IEmployeeService”。
    [ServiceKnownType(typeof(FullTimeEmployee))]
    [ServiceContract]
    public interface IEmployeeService
    {
       [OperationContract]
        Employee GetEmployee(int Id);

        [OperationContract]
        void SaveEmployee(Employee Employee);
    }
}


  3. Apply ServiceKnownType attribute on specific operation contracts.

    此种方式是把已知类型加入到服务契约的方法上,那么结果可想而知,仅仅有该服务契约的某个方法上才干够共享契约对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace EmployeeService
{
    // 注意: 使用“重构”菜单上的“重命名”命令。能够同一时候更改代码和配置文件里的接口名“IEmployeeService”。

[ServiceContract] public interface IEmployeeService {  [ServiceKnownType(typeof(FullTimeEmployee))] [OperationContract] Employee GetEmployee(int Id); [OperationContract] void SaveEmployee(Employee Employee); } }



  4.Specifiy known types in the configuration file

      最后一种方式是直接在配置文件里进行配置,因为是全局的与第一种一样。所以就不在此讲述了。



版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/blfshiye/p/4734661.html