我在 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());
有人可以帮忙吗?谢谢