私はこのようなインターフェースを手に入れました
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 を使用するのは好きではありません。また、いつか誰かがメソッド名をリファクタリングすることができ、メソッドはもうインターセプトされません。
これを行う他の方法はありますか?