gpt4 book ai didi

c# - InvocationContext 不持久化内容

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:54 25 4
gpt4 key购买 nike

我在 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 之类的内容从一个方法调用保存到下一个方法调用的正确方法是什么?

最佳答案

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

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

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

关于c# - InvocationContext 不持久化内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28143148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com