IMessageSink の実装(メソッドのロギング)

MethodLogger クラスの実装によるものとほとんど同じですが、メッセージシンクは実装を提供しなくてよいので、非常に簡潔になります。

public class MethodLoggerSink : IMessageSink
{
  private readonly IMessageSink next;

  public MethodLoggerSink(IMessageSink next)
  {
    this.next = next;
  }

  public IMessageSink NextSink
  {
    get { return this.next; }
  }

  public IMessage SyncProcessMessage(IMessage msg)
  {
    LogCallMsg(msg as IMethodCallMessage);
    
    // 次へ転送する
    return this.NextSink.SyncProcessMessage(msg);
  }
  
  public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
  {
    LogCallMsg(msg as IMethodCallMessage);
    return this.NextSink.AsyncProcessMessage(msg, replySink);
  }

  // メソッド呼び出しを記録する
  private void LogCallMsg(IMethodCallMessage req)
  {
    if (req != null)
    {
      Debug.WriteLine(req.MethodName + "が呼び出されました。");
    }
  }
}

とりあえず、IDynamicMessageSink は考えないことにしています。