メソッド呼び出しを記録する
とりあえず、実装に入るためには、 Form1 クラスが先に必要なので、
public Form1 { private int current = 0; public int Add(int value) { checked { int oldValue = current; this.current += value; return oldValue; } } }
このような単純なクラスであることにしよう。
ここで次のようなコードを実行すると、TransparentProxy の Add() メソッドが呼び出される。
private static void Test() { Form1Proxy proxy = new Form1Proxy(); Form1 form1 = proxy.GetTransparentProxy() as Form1; form1.Add( 10 ); }
TransparentProxy の Add メソッドは IMessage の形で stub へメソッドを転送する、と書いた。
クラス名は Form1Proxy と Proxy なんて名乗っているし、変数名も proxy にしてしまったが、実はこいつがスタブである。*1
つまり、転送された IMessage は、Form1Proxy.Invoke() に転送されるのだ。
ついに、メソッドの呼び出しを記録することに成功する。
public override IMessage Invoke(IMessage msg) { // メソッド呼び出しは IMethodCallMessage である IMethodCallMessage request = msg as IMethodCallMessage; // メソッドの呼び出しを記録する Debug.WriteLine(request.MethodName + "が呼び出されました!"); // TODO: 何を IMessage にして return すればよいのか? // NG return msg; }
*1:本来の姿としては、受け取ったメッセージを stub へ転送するという実装を行う。よって、まさに Proxy なのだが…