您的位置:首页 > 其它

WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[上篇](转)

2011-11-08 12:50 696 查看
[code]   1: public sealed class InstanceContext : CommunicationObject, IExtensibleObject<InstanceContext>
2: {
3:     //其他成员
4:     public InstanceContext(object implementation);
5:     public InstanceContext(ServiceHostBase host);
6:     public InstanceContext(ServiceHostBase host, object implementation);
7:
8:     public object GetServiceInstance();
9:     public object GetServiceInstance(Message message);
10:     public void ReleaseServiceInstance();
11:
12:     public IExtensionCollection<InstanceContext> Extensions { get; }
13:     public ServiceHostBase Host { get; }
14:     public ICollection<IChannel> IncomingChannels { get; }
15:     public ICollection<IChannel> OutgoingChannels { get; }
16:     public SynchronizationContext SynchronizationContext { get; set; }
17: }
[/code] InstanceContext具有三个构造函数,接受ServiceHostBase对象和具体的实例对象作为其输入参数。 GetServiceInstance和ReleaseServiceInstance用户服务实例的获取和释放。IncomingChannels和 OutgoingChannels则表示入栈和出栈信道集合。而通过SynchronizationContext属性则可以设置或获取用于异步操作的同 步上下文,比如服务操作须要在非UI线程下操作一个Windows Form的控件,你就需要基于UI线程的同步上下文(SynchronizationContext)。

二、实例上下文模式(InstanceContext Mode)

实例上下文模式(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式。如果读者熟悉.NET Remoting,肯定会很清楚.NET Remoting具有两种不同的远程对象激活方式:服务端激活对象(SAO:Server Activated Object)和客户端激活对象(CAO:Client Activated Object),而前者又具有两种不同的变体:单调(SingleCall)和单例(Singleton)。单调模式意味着服务端对于接收到的调用,都会 创建新的远程对象,而单例模式则表示服务端使用相同的远程对象处理来自不同客户端的所有远程调用。单调和单例模式体现了两种极端的远程对象激活方式,而 CAO则是一种相对折中的方式:一个客户端代理对象与一个远程对象一一匹配。WCF实例上下文模式与.NET Remoting的远程对象激活方式类似,同样具有三种不同的实例上下文模式,分别与上述三种激活方式匹配。这三种实例上下文模式分别是:单调(Per- Call)模式、会话(Per-Session)模式和单例(Single)模式。

1、单调(Per-Call)模式

单调模式相当于.NET Remoting的SingleCall远程对象激活方式。如果采用单调实例上下文模式,对于每一个服务调用,不论是来自相同的客户端(服务代理)还是不 同的客户端,WCF总是创建一个全新的服务实例和实例上下文对象来处理服务调用请求。在服务操作执行完毕,实例上下文对象和被封装的服务实例被回收调。图 2揭示了在单调模式下实例上下文、服务实例和服务代理之间的关联。





图2 单调模式下服务代理与服务实例上下文之间的关联

2、会话(Per-Session)模式

会话(Session)的目的在于保持来自相同客户端(即同一个服务代理)多次服务调用之间的状态。如果从消息交互的角度来讲,通过会话可以将来自 相同客户端的多个消息关联在一起。在会话实例上下文模式下,WCF为每一个服务代理对象分配一个单独的服务实例上下文对象,对于来自相同服务代理的所有服 务调用请求,都将分发给相同的服务实例上下文处理。会话模式与.NET Remoting下的CAO远程对象激活模式类似,图3揭示了会话模式下实例上下文、服务实例和服务代理之间的关系。





图3 会话模式下服务代理与服务实例上下文之间的关联

3、单例(Single)模式

单例模式意味着WCF为每个服务维护一个并且仅维护一个服务实例上下文。不论请求来自相同的服务代理还是不同的服务代理,处理服务调用请求都是同一 个服务实例上下文对象。单例模式相当于.NET Remoting下的Singleton远程对象激活方式,图4揭示了单例模式下实例上下文、服务实例和服务代理之间的关系。





图4 会话模式下服务代理与服务实例上下文之间的关联

三、 实例服务行为

在介绍服务寄宿的时候,我们谈到过WCF下“契约(Contract)”和“行为(Behavior)”的区别:契约是涉及双边的描述(契约是服务 的提供者和服务消费者进行交互的手段),那么行为就是基于单边的描述。客户端行为体现的是WCF如何进行服务调用的方式,而服务端行为则体现了WCF的请 求分发方式。所以服务契约会通过元数据对外发布,而服务行为则对于客户端是透明的。

对于客户端来讲,它所关心的是通过服务调用能够获得正确的结果,而不会关心服务端采用怎样的模式来激活服务实例。所以,WCF实例管理通过服务行为 体现,不同的实例上下文模式通过ServiceBehaviorAttribute特性指定。在ServiceBehaviorAttribute中,通 过设置InstanceContextMode属性来指定不同的服务实例上下文模式。

[code]   1: [AttributeUsage(AttributeTargets.Class)]
2: public sealed class ServiceBehaviorAttribute : Attribute, IServiceBehavior
3: {
4:     //其他成员
5:     public InstanceContextMode InstanceContextMode { get; set; }
6: }
[/code] 属性InstanceContextMode的类型为System.ServiceModel.InstanceContextMode枚举,三个 枚举值PerCall、PerSession和Single分别表示上述的三种实例上下文模式。默认选项为PerSession。

[code]   1: public enum InstanceContextMode
2: {
3:     PerCall,
4:     PerSession,
5:     Single
6: }
[/code] 在本系列后续部分,我将对每一种实例模式的实现原理进行逐个剖析,相信极大的加深读者对WCF下的服务对象生命周期管理机制的理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐