解释一下这个博客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
最后一种方式是直接在配置文件里进行配置,因为是全局的与第一种一样。所以就不在此讲述了。
版权声明:本文博客原创文章,博客,未经同意,不得转载。