2012-05-13 2 views
3

의 인스턴스 변수에 OperationContext.Current 저장. 서비스 호스트는 InstanceContextMode.PerCall로 설정되어 있으므로 모든 새 요청이 자체 인스턴스를 가져옵니다.나는 저장하고 WCF 서비스 호스트 인스턴스의 인스턴스 변수에 OperationContext.Current 개체를 참조하는 것이 현명 있는지 알고 싶어 WCF 서비스 인스턴스

나는이 물어 그 이유는 WCF 스레드 선호도를 보장하지 않습니다 becuase이다. 경우에 따라 WCF는 한 스레드에서 요청을 시작하고 다른 스레드에서 요청을 끝낼 수 있습니다.

OperationContext.Current 객체는 스레드 로컬 저장소에 저장됩니다. 새 스레드가 동일한 작업에 사용될 때 WCF는 새 스레드로 전파됩니다. 이 이벤트에서

, WCF는 스레드가 다른 사용을 시작할 때, 내 서비스 인스턴스의 인스턴스 변수에 저장 한 OperationContext 개체에 액세스하는 것은 여전히 ​​안전합니까? 이

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

같은 그런 구현이 -

+0

OperationContext.Current를 사용하는 대신 인스턴스 변수를 사용하면 어떤 이점이 있습니까? –

+0

우리는 WCF 서비스를 단위 테스트 할 수있는 종속성 주입 기술을 연구하고 있습니다. –

답변

2

대신 OperationContext를 저장하는, 당신이 필요로하는 컨텍스트가 제시 한 시설 추상화에 있는지 확인하고 교체 할 수있는 추상화에 포장 당신은 당신이 할 수있는 클래스 이제 UIT 테스트 내로 IContextService를 주입하면 그 가짜 버전

을 제공함으로써 실제 OperationContext

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

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

를 사용

+0

사실 그것은 거의 정확하게 내가 OperationContext.Current를 사용하는 대신에하고있는 것입니다. OperationContext의 인스턴스를 사용하여 해당 클래스의 ctor로 전달했습니다. 나는 나를 위해 변경 단순히 인스턴스 var 대신 Current 속성을 사용하는 것 같아요. DI 테스트를 사용하는 경우에도 원래의 질문은 관련성이 없습니다. 나를 깨닫게 해줘서 고마워! –