Проблема с перехватом свойства в приложении Silverlight

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

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


person joblot    schedule 17.06.2010    source источник


Ответы (1)


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

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

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

Я надеюсь, что это помогает :)

person andrecarlucci    schedule 05.10.2010