2015-01-26 8 views
2

InvocationContext 사전에 값을 추가했지만 다음 호출에서는 유지되지 않습니다. 즉, 가로 챈 체인의 각 호출은 InvocationContext.ContainsKey("tracing-id")에 대해 false를 반환합니다.InvokeContext가 내용을 유지하지 않습니다

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
{ 
    Guid tracingId; 

    if (!input.InvocationContext.ContainsKey(TRACING_ID)) 
    { 
     tracingId = _tracingIdProvider.NewTracingId(); 
     input.InvocationContext.Add(TRACING_ID, tracingId); 
    } 
    else 
    { 
     tracingId = (Guid)input.InvocationContext[TRACING_ID]; 
    } 

    var methodReturn = getNext()(input, getNext); 

    return methodReturn; 
} 
내가 getNext()(input, getNext)가 호출되고 다음 호출이 차단 될 때 그러나, InvocationContext가 비어의 InvocationContext에 항목을 추가 할 수 있습니다

.

어떻게 InvocationContext을 사용했는지 오해하니? 그렇다면 한 메서드 호출에서 ID와 같은 것을 유지하는 올바른 방법은 무엇입니까?

+0

어떤 종류의 인터셉터를 사용하고 있습니까? – cynic

+0

'InterfaceInterceptor' – BanksySan

+0

Unity 소스 코드를 간단히 살펴 봤는데 인터페이스 차단은 진행되는 모든 코드 생성으로 인해 가장 가독성이 떨어집니다. 가능한 경우 투명 프록시 인터셉터 또는 가상 메소드 인터셉터를 사용해 볼 수 있습니까? 이것이 작동하면 인터페이스 차단 구현에 버그가있을 수 있습니다. 어쨌든 스레드 로컬 저장소 나 내장 된 CallContext를 사용하여 원하는 것을 얻을 수 있습니다. – cynic

답변

2

내 테스트에 따르면 InvocationContext 속성의 내용은 한 통화 중에 만 지속됩니다. 즉, 많은 행동이 등록 된 경우에만 코드가 작동한다는 의미입니다. 동일한 메소드 호출을 위해 하나씩 호출되며 데이터를 공유하기 위해 InvocationContext을 사용할 수 있습니다. 그러나, 당신이 관찰 한대로, 다음 호출을 위해 InvocationContext이 지워질 것입니다.

Unity에서 많은 경험이 없으므로 권장되는 해결 방법이 무엇인지 알 수 없습니다. 자신 만의 호출 컨텍스트를 작성하고이를 싱글 톤으로 구현하는 것을 고려할 수 있습니다. 모든 통화가 동일한 인스턴스에 대한 액세스 권한을 가지므로 TRACING_ID는 통화 전체에서 유지됩니다. 그것은 작동해야합니다.

그러나 질문은 호출 컨텍스트를 지워야 할 때입니다. 그렇게하지 않으면 모든 통화에 동일한 TRACING_ID가 적용됩니다. 그것은 감각이 없습니다. 예를 들어 처리를 시작하는 특정 메소드 (비즈니스 시나리오)가 실행될 때 TRACING_ID를 재설정 할 수 있습니다.

+0

좋은 점은 실제로 컨텍스트가 동작 호출 사이에 유지되지만 호출 스택 아래에 있지는 않은 것 같습니다. 한 가지는 설명하지만 여전히 남은 질문은 남습니다. 호출 스택 아래로 ID를 유지하는 방법은 무엇입니까? – BanksySan

+0

@BanksySan - 내 대답에 나는 또한 해결 방법을 제안했습니다. 즉, "자신의 호출 컨텍스트를 만들고 싱글 톤으로 구현합니다."_ 그것은 @cynic에서 제안한 접근 방식과는 다른 접근 방식이지만 일반적인 생각은 비슷합니다 즉, 호출 전체에서 데이터를 유지하려면 전역 컨테이너가 필요합니다. Unity 소스 코드의 수정을 고려할 수도 있습니다. 현재 모든 새로운 호출에 대해 새로운'InvocationContext'가 생성되므로 호출을 통해 지속될 새로운 특성 (예 :'GlobalInvocationContext')을 추가하려고 시도 할 수 있습니다. 그러나 TLS가 @cynic work에 의해 제안했다면 그냥 사용하십시오. –

+0

전역 컨테이너가 작동하지만 어떻게 채우거나 지울 것인지를 어떻게 알 수 있습니까? 내 말은, 새로운 통화 체인에 대해 어떻게 생각하겠습니까? – BanksySan