Ninject.Extensions.Interception
3.0.0.8 がクラスの動的プロキシを構築する方法を理解しようとしています。から継承する属性で具象クラスを装飾するInterceptAttribute
か、メソッドでバインド時に直接インターセプトするとIntercept()
、Ninject は通常の型ではなく、装飾されたクラスの動的プロキシを返すことがわかりました。
例外ロガーインターセプターを追加する具象型にIPolicySearchPresenter
バインドするインターフェイスがあります。FlexPolicySearchPresenter
Bind<IExceptionInterceptor>().To<ExceptionInterceptor>();
Bind<IPolicySearchPresenter>().To<FlexPolicySearchPresenter>().Intercept().With<IExceptionInterceptor>();
問題は、そのバインディングの戻り値の型を検査すると、次のようになることです。
var proxy = Kernel.Get<IPolicySearchPresenter>();
Castle.Proxies.IPolicySearchPresenterProxy
代わりにのインスタンスを取得しますFlexPolicySearchPresenterProxy
これにより、私の FluorineFx リモート処理アプリで問題が発生しています。ただし、キャッスル プロキシを手動で作成すると、次のようになります。
ProxyGenerator generator = new ProxyGenerator();
//My presenter type
Type type = typeof(FlexPolicySearchPresenter);
//My presenter interface
var interfaceType = type.GetInterfaces().Single();
//Get my Interceptor from container. Notice that i had to
//change my Interceptor to implement IInterceptor from Castle libs,
// instead of Ninject IInterceptor
var excepInt = Kernel.Get<ExceptionInterceptor>();
//Manually get all my instances required by my presenter type Constructor
//ideally passed through Constructor Injection
var presenterSearchService = Kernel.Get<IPolicySearchService>();
var userAuthService = Kernel.Get<IUserAuthorizationService>();
//Create proxy, passing interceptor(s) and constructor arguments
var proxy = generator.CreateClassProxy(type, new object[] { presenterSearchService, userAuthService },
new IInterceptor[]
{
excepInt
});
//Ninject.Extensions.Interception.DynamicProxyModule
// I'm using directive ToConstant(..), and not To(..)
//Bind my interface to the new proxy
Bind(interfaceType).ToConstant(proxy).InThreadScope();
var proxy = Kernel.Get<IPolicySearchPresenter>();
返される型Castle.Proxies.FlexPolicySearchPresenterProxy
は、私のリモート処理の実装で完全に機能するものとして返されます。
問題は、Ninject.Interception が のFlexPolicySearchPresenterProxy
代わりに のインスタンスを返すようにするにはどうすればよいかということですIPolicySearchPresenterProxy
。手動の Castle の方法を実行することで、別の方法でバインドしていることに注意してください。
Bind(interfaceType).ToConstant(proxy).InThreadScope();
ninject 方法の代わりに:
Bind<IPolicySearchPresenter>().To<FlexPolicySearchPresenter>().Intercept().With<IExceptionInterceptor>();
適切なタイプを取得するために、Ninject でバインディングを行う方法を変更する必要がありますか?