首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamicProxy2: CreateClassProxyWithTarget + IInterceptor

DynamicProxy2: CreateClassProxyWithTarget + IInterceptor
EN

Stack Overflow用户
提问于 2011-05-16 15:45:34
回答 1查看 1.5K关注 0票数 1

如果我在另一个问题中漏掉了这个问题,我很抱歉;在决定我有一个独特的问题之前,我找了一段时间.我想使用DynamicProxy2为WPF应用程序的模型类提供拦截。这样我就不必在任何地方都完全实现INotifyPropertyChanged了。例如,下面的类应该在代理和截获之后充分参与双向数据绑定:

代码语言:javascript
复制
public class ModelExample : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public int Id{ get; set; }
    public string Uri{ get; set; }
    public string Name{ get; set; }
}

我发现我可以创建模型类的一个新实例,并通过调用CreateClassProxy方法来拦截对它的调用:

代码语言:javascript
复制
new ProxyGenerator().CreateClassProxy<T>(interceptors);

不幸的是,这迫使我允许ProxyGenerator类创建我的模型实例,并且我从中间层获得这些实例,即它们已经存在。我需要包装现有的对象,所以我认为需要调用CreateClassProxyWithTarget,而不是:

代码语言:javascript
复制
new ProxyGenerator().CreateClassProxyWithTarget(instance, interceptors);

但是,当我这样做时,我的拦截器就停止工作了。我很确定这不是拦截器的错..。这是一个非常简单的物体。这是它的接口:

代码语言:javascript
复制
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类型实现了这一点。BeforeAfter等方法太简单,无法显示;它们都添加到操作队列中,这些队列是在方法调用期间使用的,然后每个方法都返回this,允许方法链接。

下面的代码不起作用,但我不知道为什么:

代码语言:javascript
复制
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试一试,它就像一种魅力。有人看到我做错什么了吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-02 19:50:03

老实说,我觉得这不是问题。如果我曾经需要一个容器来为我生成INotifyPropertyChanged实现,那么它可能是在边缘的情况下,我插入由容器构建的模型对象,因为它们有缺陷等等。在这些情况下,CreateClassProxy<T>(interceptors)很好。在所有其他情况下,我一直在使用MVVM ViewModels,其中围绕更改通知的确切逻辑是逐案决定的,重点是用户体验。模型类通常以某种方式被扁平化或转换,所以整个问题都是毫无意义的。当我不知道如何在我的应用程序中适当地利用MVVM时,我问了这个问题,我认为我将负责更多的移动部件。实际上,一旦我开始正确地配置我的ViewModels,它实际上要比预期的容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6019851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档