簡體   English   中英

DynamicProxy2:CreateClassProxyWithTarget + IInterceptor

[英]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類型實現了這一點。 BeforeAfter等方法太簡單了; 它們都添加到在方法調用期間要使用的操作隊列,然后每個方法返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM