为什么WCF设计上,要有BehaviorAttribute, 而不是直接把所有设置都放到ContractAttribute里呢?
--------------------编程问答-------------------- 因为它实际上很复杂,而且是嵌套或者引用其它定义的多层次的。它相当于一个小型(文本文件)数据库,并不简单。 --------------------编程问答--------------------不太明白,Attribute 跟 数据库 的关系??
但有一点明白了,ContractAttribute 同 BehaviorAttribute 的区别在于,ContractAttribute 影响 WSDL, 就是说 ContractAttribute 是用来告诉Client, 这个服务有什么功能。
而 BehaviorAttribute 只影响Service端,是用来告诉WCF,怎么做这个服务。
现在,就剩下 为啥 System.ServiceModel 里还要有 MethodAttribute,例如TransactionFlowAttribute ? 这些 MethodAttribute 为什么不作为 OperationBehaviorAttribute 的 property呢? 而非得独立的弄出一个Attribute?
--------------------编程问答-------------------- 看了看 ServiceModel 的源码,大概明白了。
1. ContractAttribute 同 BehaivorAttribute 必须是两种,ContractAttribute 影响 WSDL, 就是说 ContractAttribute 是用来告诉Client, 这个服务有什么功能。
而 BehaviorAttribute 只影响Service端,是用来告诉WCF,怎么做这个服务。
2. 为什么有 MethodAttribute, 而不是把所有设置都放到BehaviorAttribute里?
看下源码就明白了。 OperationBehaviorAttribute 同 TransactionFlowAttribute 有一模一样的继承关系。包括 Usage 也一样。
[AttributeUsage(AttributeTargets.Method)]
public sealed class OperationBehaviorAttribute : Attribute, IOperationBehavior
[AttributeUsage(AttributeTargets.Method)]
public sealed class TransactionFlowAttribute : Attribute, IOperationBehavior
所以本质上 OperationBehaviorAttribute 同 TransactionFlowAttribute 是一种Attribute。OperationBehaviorAttribute 里 有5个public property,前3个都是简单类型,最后2个是enum。
public bool TransactionAutoComplete
public bool TransactionScopeRequired
public bool AutoDisposeParameters
public ImpersonationOption Impersonation
public ReleaseInstanceMode ReleaseInstanceMode
而 TransactionFlowAttribute是一个比较复杂的Class,自己就包含一堆东西。所以似乎独立出来比较好。
同样的现象还出现在 ServiceBehaviorAttribute 上,它有22个public property, 都是简单类型,或者enum,或者object。而System.ServiceModel 里也有一堆继承自 Attribute, IServiceBehavior 的 Attribute,也没有都放到ServiceBehaviorAttribute里。
补充:.NET技术 , Web Services