[英]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.