2012-05-13 68 views
3

我想知道在WCF服务主机实例的实例变量中存储和引用OperationContext.Current对象是否明智。服务主机被设置为InstanceContextMode.PerCall,因此每个新的请求都有自己的实例。在WCF服务实例的实例变量中存储OperationContext.Current

我问这个问题的原因是因为WCF不保证线程的亲和力。有时WCF可以在一个线程上启动请求,并在另一个线程上结束请求。

OperationContext.Current对象存储在Thread Local Storage中。当一个新线程用于相同的操作时,WCF“传播”到新线程。

在此事件中,当WCF开始使用不同的线程时,访问存储在我的服务实例的实例变量中的OperationContext对象仍然安全吗?

+0

使用实例变量而不是使用OperationContext.Current有什么好处? –

+0

我们正在探索依赖注入技术,以便能够单元测试一个WCF服务。 –

回答

2

不是存储OperationContext的,包装在可更换确保您需要通过上下文提供的设施都在抽象的抽象 - 这样的事情

interface IContextService 
{ 
    Message RequestMessage{ get;} 
    string SessionId{ get;} 
} 

然后有一个实现使用真正的OperationContext

class ContextService : IContextService 
{ 
    public Message RequestMessage 
    { 
     get 
     { 
      return OperationContext.Current.RequestContext.RequestMessage; 
     } 
    } 

    public string SessionId 
    { 
     get 
     { 
      return OperationContext.Current.SessionId; 
     } 
    } 
} 

如果注入的IContextService到你的类,你现在可以UIT测试提供了一个仿版

+0

其实这就是我正在做的事情,除了使用OperationContext.Current之外,我正在使用传递给该类的ctor的OperationContext的实例。我猜想对我而言的改变只是简单地使用Current属性而不是实例var。即使使用DI进行测试,这也使得原始问题无关紧要。感谢让我意识到这一点! –