Я использую Ninject в качестве DI-контейнера в приложении Silverlight. Сейчас я расширяю приложение для поддержки перехвата и начал интегрировать расширение DynamicProxy2 для Ninject. Я пытаюсь перехватить вызов свойств в ViewModel и в итоге получаю следующее исключение:
«Попытка доступа к методу не удалась: System.Reflection.Emit.DynamicMethod..ctor (System.String, System.Type, System.Type [], System.Reflection.Module, Boolean)»
Это исключение выдается при вызове метода invocation.Proceed (). Я попробовал две реализации перехватчика, и они оба терпят неудачу
public class NotifyPropertyChangedInterceptor: SimpleInterceptor
{
protected override void AfterInvoke(IInvocation invocation)
{
var model = (IAutoNotifyPropertyChanged)invocation.Request.Proxy;
model.OnPropertyChanged(invocation.Request.Method.Name.Substring("set_".Length));
}
}
public class NotifyPropertyChangedInterceptor: IInterceptor
{
public void Intercept(IInvocation invocation)
{
invocation.Proceed();
var model = (IAutoNotifyPropertyChanged)invocation.Request.Proxy;
model.OnPropertyChanged(invocation.Request.Method.Name.Substring("set_".Length));
}
}
Я хочу вызвать метод OnPropertyChanged для ViewModel, когда установлено значение свойства.
Я использую перехват на основе атрибутов.
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class NotifyPropertyChangedAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
if(request.Method.Name.StartsWith("set_"))
return request.Context.Kernel.Get<NotifyPropertyChangedInterceptor>();
return null;
}
}
Я протестировал реализацию с помощью консольного приложения, и она работает нормально.
Я также заметил в Консольном приложении, что у меня есть Ninject.Extensions.Interception.DynamicProxy2.dll в той же папке, что и Ninject.dll. Мне не нужно было явно загружать DynamicProxy2Module в Ядро, где я должен был явно загрузить для применения Silverlight следующим образом:
IKernel kernel = new StandardKernel(new DIModules(), new DynamicProxy2Module());
Может ли кто-нибудь помочь, пожалуйста? Спасибо