![](/img/trans.png)
[英]How to avoid double construction of proxy with DynamicProxy::CreateClassProxyWithTarget?
[英]DynamicProxy2: CreateClassProxyWithTarget + IInterceptor
如果我在另一个问题中错过了这个,我道歉; 在决定我有一个独特的问题之前,我找了好一会儿...我想使用DynamicProxy2为WPF应用程序的模型类提供拦截。 这样我就不必在任何地方完全实现INotifyPropertyChanged。 例如,下面的类应该在代理和截获后完全参与双向数据绑定:
public class ModelExample : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int Id{ get; set; }
public string Uri{ get; set; }
public string Name{ get; set; }
}
我发现我可以通过调用CreateClassProxy方法创建模型类的新实例并拦截对它的调用:
new ProxyGenerator().CreateClassProxy<T>(interceptors);
不幸的是,这迫使我允许ProxyGenerator
类创建我的模型实例,并且我从中间层获取它们,即它们已经存在。 我需要包装现有对象,所以我认为我需要调用CreateClassProxyWithTarget
:
new ProxyGenerator().CreateClassProxyWithTarget(instance, interceptors);
但是,当我这样做时,我的拦截器停止运作。 我很确定这不是拦截器的错...它是一个非常简单的对象。 这是它的界面:
public interface IFluentInterceptor : IInterceptor
{
IFluentInterceptor Before(Action<IInvocation> before);
IFluentInterceptor After(Action<IInvocation> after);
IFluentInterceptor Finally(Action<IInvocation> @finally);
IFluentInterceptor RunCondition(Func<IInvocation, bool> runCondition);
IFluentInterceptor OnError(Func<IInvocation, Exception, bool> onError);
}
FluentInterceptor
类型实现了这一点。 Before
, After
等方法太简单了; 它们都添加到在方法调用期间要使用的操作队列,然后每个方法返回this
,允许方法链接。
以下代码不起作用,但我无法弄清楚原因:
new ProxyGenerator().CreateClassProxyWithTarget(instance, new FluentInterceptor()
.After(invocation =>
{
if (!invocation.Method.Name.StartsWith("set_")) return;
string propertyName = invocation.Method.Name.Substring(4);
FieldInfo info = invocation.TargetType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
.Where(f => f.FieldType.Equals(typeof (PropertyChangedEventHandler)))
.FirstOrDefault();
if (info == null) return;
var handler = info.GetValue(invocation.InvocationTarget) as PropertyChangedEventHandler;
if (handler != null) handler.Invoke(invocation.TargetType, new PropertyChangedEventArgs(propertyName));
}));
如果我尝试使用CreateClassProxy
,它就像一个魅力。 有人看到我做错了吗?
谢谢!
老实说,我认为这不是问题。 如果我需要一个容器来为我生成INotifyPropertyChanged
实现,它可能会在我插入由容器构建的模型对象的边缘情况下,因为它们具有依赖性等。在这些情况下CreateClassProxy<T>(interceptors)
很好。 在所有其他情况下,我一直在使用MVVM ViewModels,其中围绕变更通知的确切逻辑是根据具体情况决定的,以用户体验为重点。 模型类通常会以某种方式变平或变换,因此整点都没有实际意义。 当我不明白如何在我的应用程序中正确利用MVVM时,我问过这个问题,而且我认为我将负责更多移动部件。 一旦我开始正确配置我的ViewModel,它实际上比预期容易得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.