Я использую 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());
Может кто-нибудь помочь? Спасибо