KnownTypeAttribute与ServiceKnownTypeAttribute

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

 1: [DataContract]
typeof(Order))]
class OrderBase : IOrder
 4: {
//省略成员
 6: }

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

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

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

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

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

>
>
>
>
>
>
/>
>
>
>
>

相关文章: