私は出かけますここに足を踏み入れて、「インストルメンテーションを実装するためのオブジェクト指向の手法を探している」と推測します。
すぐに思い浮かぶ2つの方法があります。最も一般的に使用されるのは、最初に推測する方法です。
-
グローバル(シングルトンまたは何を持っているか)スタックをどこかに置き、実行するすべてのメソッドがすぐに追加されます。グローバルな呼び出しチェーンを効果的に維持します。ポップする必要はありません。インストルメントしようとしている各メソッドの終わり、他の一般的なインストルメンテーション手法は、メソッドの最初でストップウォッチを開始し、最後で停止して長さなどを記録することです。
-
すべてのメソッド呼び出しのルーターであるDIタイプのフレームワークがあります。メッセージパッシングに似ており、このフレームワーク内では、この1つの場所に一元化されることを除いて、上記と同様に発生するすべてのメソッド呼び出しをスタックに書き留めます。
AOPフレームワークなどを使用せずに#2を提案することはできませんが、全体として、メソッド呼び出しの100%で独自のスタックトレースを維持することは、私の目には少し極端な手段です。タイプのもののデバッグに最適で、再帰言語で作業していない場合はおそらく必要ですが、本番環境ではそのようなものを簡単にオフにして、邪魔にならないように最善を尽くすことができると確信しています。そのため、私は上記の#2はあまり好きではありません。
これらはどちらも再帰言語内では必要ないため、交差プロセスを説明する場合を除いて、C#で実装しないでください。境界。(注意:正しく実行された場合、リフレクションよりも高速になる可能性がありますが、メンテナンスコストがかかるため、価値がありません)
コメント
私見では、なぜこれが必要だと思うのかを真剣に自問する必要があります。
MethodFoo()
がアセンブリAまたはBから呼び出された場合の動作が異なる場合、呼び出し元のアセンブリはMethodFoo()
そして、おそらく予期しないまたは誤った動作の原因になる可能性があります。そのため、別の方法として、その入力パラメーターを明示的にします。コンテキストまたは呼び出し元を示すパラメーターをMethodFoo()
に追加します。 これは、enum
、string
パラメーター、または
。
コメント