• wcf KnownTypeAttribute 武胜


    KnownTypeAttribute与ServiceKnownTypeAttribute

    对于已知类型,可以通过两个特殊的自定义特性进行设置:KnownTypeAttribute和 ServiceKnownTypeAttribute。KnownTypeAttribute应用于数据契约中,用于设置继承与该数据契约类型的子数据契 约类型,或者引用的其他潜在的类型。ServiceKnownTypeAttribute既可以应用于服务契约的接口和方法上,也可以应用在服务实现的类 和方法上。应用的目标元素决定了定义的已知类型的作用范围。下面的代码中,在基类OrderBase指定了子类的类型Order。

     1: [DataContract]
     2: [KnownType(typeof(Order))]
     3: public abstract class OrderBase : IOrder
     4: {
     5: //省略成员
     6: }

    而ServiceKnownTypeAttribute特性,仅可以使用在服务契约类型上,也可以应用在服务契约的操作方法上。如果应用在服务契约 类型上,已知类型在所有实现了该契约的服务操作中有效,如果应用于服务契约的操作方法上,则定义的已知类型在所有实现了该契约的服务对应的操作中有效。

     1: [ServiceContract]
     2: [ServiceKnownType(typeof(Order))]
     3: public interface IOrderManager
     4: {
     5: [OperationContract]
     6: void ProcessOrder(OrderBase order);
     7: }
     1: [ServiceContract]
     2: public interface IOrderManager
     3: {
     4: [OperationContract]
     5: [ServiceKnownType(typeof(Order))]
     6: void ProcessOrder(OrderBase order);
     7: }

    ServiceKnownTypeAttribute也可以应用于具体的服务类型和方法上面。对于前者,通过ServiceKnownTypeAttribute定义的已知类型在整个服务的所有方法中有效,而对于后者,则已知类型仅限于当前方法。

     1: [ServiceKnownType(typeof(Order))]
     2: public class OrderManagerService : IOrderManager
     3: { 
     4: public void ProcessOrder(OrderBase order)
     5: {
     6: //省略成员
     7: }
     8: }
     1: public class OrderManagerService : IOrderManager
     2: {
     3: [ServiceKnownType(typeof(Order))]
     4: public void ProcessOrder(OrderBase order)
     5: {
     6: //省略成员
     7: }
     8: }

    除了通过自定义特性的方式设置已知类型外,已知类型还可以通过配置的方式进行指定。已知类型定义 在<system.runtime.serialization>配置节中,采用如下的定义方式。这和我们在上面通过 KnownTypeAttribute指定Order类型是完全等效的。

     1: <?xml version="1.0" encoding="utf-8" ?>
     2: <configuration>
     3: <system.runtime.serialization>
     4: <dataContractSerializer>
     5: <declaredTypes>
     6: <add type="Artech.DataContractSerializerDemos.OrderBase,Artech.DataContractSerializerDemos.KnownTypes">
     7: <knownType type="Artech.DataContractSerializerDemos.Order,Artech.DataContractSerializerDemos.KnownTypes"/>
     8: </add>
     9: </declaredTypes>
     10: </dataContractSerializer>
     11: </system.runtime.serialization>
  • 相关阅读:
    按钮,文本框
    d01
    第一天,对于课程和工作的了解
    javaweb概念性知识
    Jdbc概念性知识
    连接数据库,和数据增删改
    oracle基础概念性知识
    面向对象java知识汇总题
    javaweb
    date日期
  • 原文地址:https://www.cnblogs.com/zeroone/p/2454785.html
Copyright © 2020-2023  润新知