Ошибка перехвата свойства в приложении Silverlight - PullRequest
1 голос
/ 17 июня 2010

Я использую 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());

Может ли кто-нибудь помочь, пожалуйста? Спасибо

1 Ответ

0 голосов
/ 06 октября 2010

Отражение в серебряном свете может быть очень сложным из-за проблем с безопасностью.

Проверьте ответ Гейба на на этот вопрос , это та же проблема.

Хорошая новость заключается в том, чтоВы можете достичь той же функциональности, которую хотите, используя динамические вместо прокси.Просто расширьте вашу ViewModel из DynamicObject и переопределите метод TrySetMember.

Надеюсь, это поможет:)

...