2

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

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 之类的东西持久化的正确方法是什么?

4

1 回答 1

2

我的测试表明,InvocationContext属性的内容仅在一次调用期间保持不变。这意味着您的代码只有在注册了许多行为时才能工作。它们将被同一个方法调用一一调用,并且可以InvocationContext用来共享数据。但是,正如您所观察到的,对于下一个呼叫InvocationContext将被清除。

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

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

于 2015-01-30T16:35:56.967 回答