1

我在 Silverlight 应用程序中使用 Ninject 作为 DI 容器。现在我正在扩展应用程序以支持拦截,并开始为 Ninject 集成 DynamicProxy2 扩展。我试图拦截对 ViewModel 上的属性的调用并最终得到以下异常:

“尝试访问方法失败:System.Reflection.Emit.DynamicMethod..ctor(System.String, System.Type, System.Type[], System.Reflection.Module, Boolean)”</p>

调用 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));
    }
}

设置属性值时,我想在 ViewModel 上调用 OnPropertyChanged 方法。

我正在使用基于属性的拦截。

[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.dll 相同的文件夹中有 Ninject.Extensions.Interception.DynamicProxy2.dll,我就不必将 DynamicProxy2Module 显式加载到内核中,因为我必须为 Silverlight 应用程序显式加载它如下:

IKernel kernel = new StandardKernel(new DIModules(), new DynamicProxy2Module());

有人可以帮忙吗?谢谢

4

1 回答 1

0

由于安全问题,反射在 Silverlight 中可能非常棘手。

检查 Gabe 对这个问题的回答,这是同样的问题。

好消息是您可以使用动态而不是代理来实现您想要的相同功能。只需从 DynamicObject 扩展您的 ViewModel 并覆盖 TrySetMember 方法。

我希望它有帮助:)

于 2010-10-05T21:30:15.223 回答