1

私はこのようなインターフェースを手に入れました

public interface IService
{
    void InterceptedMethod();
}

そのインターフェースを実装し、別のメソッドも持つクラス

public class Service : IService
{
    public virtual void InterceptedMethod()
    {
        Console.WriteLine("InterceptedMethod");
    }

    public virtual void SomeMethod()
    {
        Console.WriteLine("SomeMethod");
    }
}

そしてインターセプター

public class MyInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Intercepting");
        invocation.Proceed();
    }
}

IService に存在する Service のメソッドのみをインターセプトしたい (つまり、InterceptedMethod() をインターセプトしたいが SomeMethod() はインターセプトしたくない) が、IProxyGenerationHook からの ShouldInterceptMethod を使用したくない。

このようにできますが、インターフェイスを返すため、このオブジェクトで SomeMethod を呼び出すことはできません

var generator = new ProxyGenerator();
var proxy = generator.CreateInterfaceProxyWithTargetInterface<IService>(new Service(), new MyInterceptor());
proxy.InterceptedMethod(); // works
proxy.SomeMethod(); // Compile error, proxy is an IService

機能することの1つは、仮想を SomeMethod() から削除し、次のようにすることです

var proxy = generator.CreateClassProxy<Service>(new MyInterceptor());

しかし、私はこの解決策が好きではありません。

インターフェイスを変更するたびに、ShouldInterceptMethod も変更する必要があるため、IProxyGenerationHook から ShouldInterceptMethod を使用するのは好きではありません。また、いつか誰かがメソッド名をリファクタリングすることができ、メソッドはもうインターセプトされません。

これを行う他の方法はありますか?

4

1 に答える 1

3

クラスのプロキシを作成する場合は、classproxy を使用する必要があります。

特定のメンバーを除外したい場合は、IProxyGenerationHook を使用する必要があります。

名前の署名が追加または削除されるなど、インターフェイス/クラスのメンバーへの変更にコードをとらわれないようにしたい場合は、そうするよりも!

私が考えることができる最も単純なコードは次のようなものです:

private InterfaceMap interfaceMethods = typeof(YourClass).GetInterfaceMap(typeof(YourInterface));
public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo)
{
   return Array.IndexOf(interfaceMethods.ClassMethods,methodInfo)!=-1;
}
于 2010-01-21T17:33:37.983 に答える