Я пытаюсь понять, как Ninject.Extensions.Interception
3.0.0.8 создает динамические прокси для моих классов. Я обнаружил, что когда я украшаю свои конкретные классы атрибутом, который наследуется от InterceptAttribute
или когда я напрямую перехватываю время привязки с помощью метода Intercept()
, тогда Ninject возвращает динамический прокси украшенного класса вместо обычного типа.Почему Ninject Bind with Interception возвращает прокси-сервер?
У меня есть IPolicySearchPresenter
интерфейса, который я привязка к конкретному типу FlexPolicySearchPresenter
добавления Exception регистратора перехватчика:
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
. Обратите внимание, что, делая ручной замок, как я связывающую иначе:
Bind(interfaceType).ToConstant(proxy).InThreadScope();
Вместо Ninject образом:
Bind<IPolicySearchPresenter>().To<FlexPolicySearchPresenter>().Intercept().With<IExceptionInterceptor>();
мне нужно сделать, чтобы изменить способ, которым я делаю Binding в Ninject, чтобы получить правильный тип?
Вы пытались создать привязку с IPolicy .. к FlexPolicy * и *, а затем привязку FlexPolicy .ToSelf() .Intercept(). С ...? (Sidenote: перехватчики ninject instanciaties один раз для каждого типа, а не один экземпляр прокси). – BatteryBackupUnit
Нет, я не пробовал. Я попробую сегодня утром. Спасибо за предложение –
Я сделал это: 'Bind(). ();' 'Bind (). ToSelf(). Intercept(). С ();' 'var proxy = Kernel.Get ();' Но прокси возвращается как «FlexPolicySearchPresenter», а не «FlexPolicySearchPresenterProxy», а перехват не пинает :( –