【发布时间】:2018-08-08 12:43:54
【问题描述】:
我有一个 WPF 应用程序和一个从客户端应用程序获取队列中消息的工作进程。
有几个用户可以点击多个项目,从而将多个进程发送到队列中,因此我需要为每个用户设置某种唯一 ID。
我想为此实现检测日志记录,但我发现很难为该进程拥有一个主键或 ID。我有可以用作 ID 的消息 ID,但在调用方法时会丢失,我不想将其传递给每个方法。
例如,如果过程如下:
- 用户点击数据检索按钮
- 使用消息 ID 创建消息 -> 使用消息 ID 登录检测
- Worker 使用 Message Id 获取消息 -> 使用相同的消息 ID 登录工具
- 调用的数据检索方法(无消息 ID)-> 无法记录
基本上我不想将消息 ID 传递给每个方法(例如第 4 步),因为这会变得非常混乱。
我正在使用 Castle Proxies 来处理日志记录,但我再次找不到一个只为日志提供一个通用 ID 的好方法,因此我可以一直记录一个请求以及每个部分需要多长时间。
我有一些与此非常相似的东西: Instrumentation With Interceptors
除了被调用的每个方法的 ID 之外,我还需要一个整体 ID 来将整个请求组合在一起。
【问题讨论】:
-
您会考虑使用“上下文”吗?因此,在处理消息时,将向每个提供者注入一个“上下文”。所以所有处理的数据都将用于这个“上下文”。并将上下文与您的消息 ID 相关联。
-
我已经将它作为队列消费者的参数,例如:Consume(ConsumeContext
context),它包含消息 ID,然后问题是如何将其传播到然后被调用而不必传递它。这是你的意思吗? -
我明白了,你所说的“记录”真的是指“记录”吗?据我所知,有两个选择:1.我不确定您的记录器是如何实现的。您可能需要注入记录器工厂。或者,2. 如果没有并行代码,则将用户视为 ThreadStatic。或 TPL 的 CallContext.GetLogicalData。但它看起来有点乱,特别是对于 TPL,你需要维护一个上下文。
-
CallContext 完美运行,谢谢!
-
@Steven.Xi 将其作为答案,我会将其标记为已回答
标签: c# instrumentation castle-dynamicproxy