InvocationContext不持久化内容

时间:2015-01-26 00:14:09

标签: c# .net unity-container unity-interception

我在InvocationContext字典中添加了一个值,但它不会持续到下一个调用。即被拦截的链中的每个呼叫都为InvocationContext.ContainsKey("tracing-id")返回false。

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;
}

我可以向InvocationContext添加条目,但是,当调用getNext()(input, getNext)并拦截下一个电话时,InvocationContext为空。

我误解了如何使用InvocationContext吗?如果是这样,那么从一个方法调用到下一个方法调用中持久保存ID的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

我的测试显示InvocationContext属性的内容仅在一次调用期间保留。这意味着只有在注册了许多行为时,您的代码才会起作用。对于相同的方法调用,它们将逐个调用,并且可以使用InvocationContext来共享数据。但是,正如您所观察到的那样,下次通话InvocationContext将被清除。

我对Unity没有太多经验,所以我不知道推荐的解决方法是什么。您可以考虑创建自己的调用上下文并将其实现为单例。由于所有呼叫都可以访问同一个实例,因此TRACING_ID将在呼叫期间保持不变。它应该工作。

但是,问题是应该清除调用上下文。如果您不这样做,那么所有呼叫将具有相同的TRACING_ID。它没有意义。例如,您可能希望在执行负责启动处理(业务场景)的特定方法时重置TRACING_ID。