在运行时将包装器附加到所有现有的事件处理程序



我目前非常需要现有应用程序的日志记录,无法直接在代码中添加我期望的日志记录级别。作为一种变通方法,我很乐意在每次触发事件时都进行一定量的日志记录。

我正在考虑一种解决方案,在运行时,我可以解析整个应用程序,用事件到包装器到处理程序来包装所有事件到处理程序的绑定;理想情况下,也可以在运行时打开它们。在伪码中,这将是:

IDictionary<Event, Action<object, EventArgs>) originalBindings = ...;
public void SetWrapBindings()
{
var allBindingsToReplace = Assembly.GetAssembly().GETALLEVENTS()
.Where(eventInfo => eventInfo.GetOtherMethods().Any());
foreach(var binding in allBindingsToReplace)
{
binding.event -= binding.handler;
binding.event += HandlerWrapper;
originalBindings.Add(binding.event, binding.handler);
}
}
public static void HandlerWrapper(object o, EventArgs e)
{
// Do some logging
try
{
var handler = originalBindings.TryGetValue(/* something */);
handler.Invoke(o, e);
}
// Do more logging
}

在这堆伪代码中,有很多步骤我无法编写,可能是因为我没有找到正确的API用法,但也可能是因为其中的一些操作在理论上是不可能的(在这种情况下,我很想知道为什么)。这些是:

  • 遍历应用程序的所有事件(这可能很容易)
  • 为我的IDictionary确定一个好的密钥
  • 在每一步中,从上下文中获取相关信息

当然,将一个额外的处理程序绑定到每个现有事件(在执行例程之前/之后,而不真正包装处理程序)会有所帮助,但在try-catch中执行真正的处理程序是一件很好的事情。

任何部分答案仍然非常感谢

如果您正在寻找非侵入式系统范围的日志记录,最好使用PostSharp这样的面向方面的编程框架。这个页面为您所要查找的内容提供了一个不错的起点。

编辑:要添加此功能,如果您真的只是想知道何时引发任何事件,请考虑实现EventInterceptionAspect。同样,PostSharp博客是一个很好的信息来源,本文展示了这方面的一个实现,它可以进行添加、删除和调用的简单stdout日志记录。

相关内容

  • 没有找到相关文章

最新更新