我正在阅读JuvalLöwy的编程WCF服务。它提到:
在WCF中,我们有Context,我们在其中拥有实例。默认情况下,上下文的生命周期与其承载的实例的生命周期相同。我们可以为两者分别设定生命周期。 WCF还允许在没有关联实例的情况下存在上下文。
为什么我们会释放实例并保持上下文为空?
答案 0 :(得分:1)
巧合的是,我最近读到了你可能指的那一章。在他的书中,Löwy解释了为什么这可能有用。首先他写道:
WCF还允许在没有关联实例的情况下存在上下文。我将此实例管理技术称为上下文停用。
提到这通常是使用具有特定ReleaseInstanceMode的OperationBehavior完成的,他继续并提示您何时可以使用它:
您通常对某些但不是所有服务方法应用实例停用,或对不同方法应用不同的值。 [...]您通常偶尔应用它的原因是,如果您要统一应用它,您最终会得到类似于每个呼叫的服务,在这种情况下,您可能也会按照呼叫配置服务
因此,您可以使用此“停用”来确保只有具有会话的服务中的某些方法就像它们是每个呼叫服务的一部分一样。上述MSDN文章也用不同的措辞解释了这一点:
使用ReleaseInstanceMode属性指定WCF在执行方法的过程中何时回收服务对象。默认行为是根据InstanceContextMode值回收服务对象。设置ReleaseInstanceMode属性会更改该默认行为。在事务方案中,ReleaseInstanceMode属性通常用于确保在处理方法调用之前清除与服务对象关联的旧数据。
答案 1 :(得分:0)
在以下情况下断开上下文与实例的关联:
自定义/扩展实例创建。例如,如果您使用带有依赖注入库(例如Unity)的自定义IInstanceProvider创建服务实例,则可能需要Unity生命周期管理器来处理服务实例生存期。
部分但不是所有操作都会导致昂贵的服务实例失效。例如:服务对象将大型费用资源作为创建的一部分加载。如果客户端调用的服务操作修改或使资源无效,则需要为下一个调用者处理和重新加载它。如果操作不使资源无效,则下一个调用者可以重用服务实例。 (在几乎所有情况下都有更好的方法来解决这个问题,但是WCF允许它。)
我确定还有其他用例。