LinFu.DynamicProxyの使い方が分からない
MefContribにCastle以外にもLinFu.DynamicProxyが含まれていたので弄ってみたのですが、どうにも使い方が分かりません。
using LinFu.DynamicProxy; public class MyInterceptor : IInterceptor { public object Intercept(InvocationInfo info) { return info.TargetMethod.Invoke(info.Target, info.Arguments); } }
おおよそ、Casle.DynamicProxyと同じ使い方だと思うのですが、割り込み対象であるはずのinfo.Targetがプロキシになっているんですよね。で、Invokeするとまた、割り込みメソッドが呼び出され・・・スタックオーバーフロー。LinFuのサンプルを見るとインターセプタのコンストラクタで割り込み対象オブジェクトを渡す例が多く、InvocationInfoだけじゃ情報が足りていない気がします。
using LinFu.DynamicProxy; public class MyInterceptor : IInterceptor, IWithTarget { public object Intercept(InvocationInfo info) { // info.Targetの代わりにTargetを使う return info.TargetMethod.Invoke(Target, info.Arguments); } public object Target { get; set; } }
こんな風に、IWithTargetインタフェースも実装してやって、MefContribLinFu.DynamicProxyInterceptor.csを
public object Intercept(object value) { var interfaces = value.GetType().GetInterfaces(); var proxyInterface = interfaces.FirstOrDefault(); var additionalInterfaces = interfaces.Skip(1).ToArray(); // 割り込み対象をインターセプタに設定する if (interceptor is IWithTarget) (interceptor as IWithTarget).Target = value; return Generator.CreateProxy(proxyInterface, this.interceptor, additionalInterfaces); }
とすると動きました。
ただ、全くテストされていないとは思えないので、私の使い方が間違っていると思うんですけどね・・・