IMessageSink の提供

さて、実際に上記のクラスを提供する部分ですが、ServerContextSink, ServerContextSink, EnvoySink, ObjectSink の4つのエントリから適切なものを選択しなければなりません。
このうち、簡単に予測がつくものは ServerContext と ClientContext で、これらは MethodLogger の実装で利用してきたリモート処理の端点である server object と proxy object におけるメッセージ交換に相当するであろうことは容易に想像がつきます。
とりあえず、4つのポイントすべてに対して MethodLoggerSink をつっこんでみると、たっぷり呼び出しのログが手に入るので、順番にみていこう。

誰が IContributeXXX を実装するのか

それに先立って、見ておくべきことの1つに、IContributeXXX がどこから取得されるのか? という問題がある。
ContextAttribute の派生クラスとして実装を進めていると、ContextAttribute が IContributeXXX を実装していれば、ContextBoundObject の生成時に MessageSink を登録することができるのだが、Attribute 派生クラスとして IContextAttribute を実装している場合には、IContributeXXX の実装を行っても MessageSink を提供することができない。
IContributeXXX を実装するオブジェクトは、IContextAttribute.GetPropertiesForNewContext() において Context.Properties に対して追加される IContextProperty の実装クラスである。

よって、IContextAttribute と IContextProperty を個別に実装する場合は、

public class MethodLoggerAttribute : Attribute, IContextAttribute
{
  // (略)
}

public class MethodLoggerProperty : IContextProperty,
  IContributeServerContextSink, IContributeClientContextSink, ...
{
  // (略)
}

というような具合になる。覚えておいて損はないかもしれない。