私が必要としているのは、2人の親を持つクラスContextBoundObject
ともう1つのクラスです。
理由ContextBoundOject
:メソッド呼び出しをログに記録するには、にアクセスする必要があります。
作曲はうまくいきますか?現在のところ、ありません(特にタイプは認識されません)。
これを行う他の方法はありますか?はい。ただし、それほど自動化できず、サードパーティのコンポーネントがありません(T4でも可能かもしれませんが、私は専門家ではありません)。
より詳細な説明。
フレームワークの内部動作にアクセスするために、システムクラス(たとえば、およびの親用にすでに(の親である)を持っているものと、持っていないものがあります)を拡張して、メソッド呼び出しをログに記録できるようにする必要がありますMarshalByRefObject
(今のところ、将来は変更される可能性があります)。ContextBoundObject
ServiceBase
FileSystemWatcher
Exception
Timer
この方法を使用する場合、すべてのメソッドにログ呼び出しを追加するのではなく、ログに記録するオブジェクトにクラス名を追加するだけで済みますが、明らかにこれを行うことはできません。
public class MyService:ServiceBase,ContextBoundObject,IDisposable{
public MyService(){}
public Dispose(){}
}
したがって、通常のソリューションであるインターフェイスを試すことができますが、Runを次のように呼び出すと次のようになります。
ServiceBase.Run(new MyService());
架空のインターフェイスIServiceBaseを使用すると、タイプServiceBaseがIServiceBaseにキャストできないため、機能しません。これは、どのインターフェイスからも継承されません。例外を除いて、問題はさらに悪化します。throw
から派生した型のみを受け入れますException
。
逆に、IContextBoundObjectインターフェイスを生成することも機能しないようです。ロギングメカニズムはメソッドによって機能しないため、属性といくつかの小さな内部クラスだけを実装する必要はありません(そして、から継承しますContextBoundObject
。からでもMarshalByRefObject
、メタデータは実質的に同じものとして表示されます)。
私が見たところ、fromContextBoundObject
を拡張すると、拡張クラスがProxy
(おそらく、この方法でメソッド呼び出しがSyncProcessMessage(IMessage)を使用するため、インターセプトしてログに記録できるため)、継承なしでそれを行う方法があるか、または可能性がありますロギング呼び出し(T4テキストテンプレートなど)を使用してメソッドを囲むために利用できるコンパイル前またはコンパイル後の手法であるかどうかはわかりません。
誰かがこれを見てみたい場合は、プログラムでカスタマイズされたバージョンのMSTestExtentionsを使用して、(メソッド呼び出しの)ロギングを実行しました。どんなアイデアでも大歓迎です。さらに説明が必要な場合がありますので、お尋ねください。