0

現在、既存のアプリケーションのロギングが非常に必要であり、期待するレベルのロギングをコードに直接追加する余裕がありません。回避策として、イベントが発生するたびに一定量のログが記録されることを嬉しく思います。

実行時にアプリケーション全体を解析して、すべてのイベントからハンドラーへのバインディングをイベントからラッパーからハンドラーにラップできるソリューションを検討しています。そして、理想的には、実行時にもそれらをアンラップします。擬似コードでは、これは次のようになります。

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に適したキーを特定する
  • 各ステップで、コンテキストから関連情報を取得します

もちろん、既存の各イベントに1つの追加ハンドラーをバインドする(ハンドラーを実際にラップせずにルーチンを実行する前/後)ことは役立ちますが、try-catch内で実際のハンドラーを実行することは非常に便利です。

部分的な答えはまだ大歓迎です

4

1 に答える 1

1

非侵襲的なシステム全体のロギングを探している場合は、PostSharpのようなアスペクト指向プログラミングフレームワークを使用することをお勧めします。 このページはあなたが探しているもののためのまともな出発点を提供します。

編集: これに追加するにはEventInterceptionAspect、イベントが発生したときに本当に知りたい場合は、の実装を検討してください。繰り返しになりますが、PostSharpブログは優れた情報源であり、この記事では、追加、削除、および呼び出しの単純なstdoutロギングを行うこの側面の実装を示しています。

于 2012-11-14T23:39:40.410 に答える