我在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());
有人可以帮忙吗?感谢
答案 0 :(得分:0)
由于安全问题,反思在Silverlight中可能非常棘手。
检查Gabe对this question的回答,这是同样的问题。
好消息是,您可以使用动态代替代理来实现所需的相同功能。只需从DynamicObject扩展ViewModel并覆盖TrySetMember方法。
我希望它有所帮助:)