我在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的正确方法是什么?
答案 0 :(得分:2)
我的测试显示InvocationContext
属性的内容仅在一次调用期间保留。这意味着只有在注册了许多行为时,您的代码才会起作用。对于相同的方法调用,它们将逐个调用,并且可以使用InvocationContext
来共享数据。但是,正如您所观察到的那样,下次通话InvocationContext
将被清除。
我对Unity没有太多经验,所以我不知道推荐的解决方法是什么。您可以考虑创建自己的调用上下文并将其实现为单例。由于所有呼叫都可以访问同一个实例,因此TRACING_ID将在呼叫期间保持不变。它应该工作。
但是,问题是应该清除调用上下文。如果您不这样做,那么所有呼叫将具有相同的TRACING_ID。它没有意义。例如,您可能希望在执行负责启动处理(业务场景)的特定方法时重置TRACING_ID。