在Silverlight应用程序中发出拦截属性

时间:2010-06-17 01:06:03

标签: silverlight silverlight-3.0 ninject interceptor castle

我在Silverlight应用程序中使用Ninject作为DI容器。现在我正在扩展应用程序以支持拦截并开始为Ninject集成DynamicProxy2扩展。我试图拦截对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));
    }
}

我想在设置属性值时在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());

有人可以帮忙吗?感谢

1 个答案:

答案 0 :(得分:0)

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

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

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

我希望它有所帮助:)