【发布时间】:2023-04-03 09:33:01
【问题描述】:
我正在使用 Spring.Net 1.3.1 和 MVVM Foundation 来对我的视图模型应用横切。我注意到,如果我在对象转换为横切代理之前分配属性更改处理程序,则代理引擎不会将属性更改处理程序应用于代理。有谁知道这是否是预期行为,如果是,是否有解决方法?
我的工厂是这样的
public static class AopProxyFactory {
public static object GetProxy(object target) {
var factory = new ProxyFactory(target);
factory.AddAdvisor(new Spring.Aop.Support.DefaultPointcutAdvisor(
new AttributeMatchMethodPointcut(typeof(AttributeStoringMethod)),
new UnitValidationBeforeAdvice())
);
factory.AddAdvice(new NotifyPropertyChangedAdvice());
factory.ProxyTargetType = true;
return factory.GetProxy();
}
}
建议看起来像这样
public class UnitValidationBeforeAdvice : IMethodBeforeAdvice {
public UnitValidationBeforeAdvice() {
}
public void Before(MethodInfo method, object[] args, object target) {
if (args.Length != 1) {
throw new ArgumentException("The args collection is not valid!");
}
var canConvertTo = true;
if (!canConvertTo) {
throw new ArgumentException("The '{0}' cannot be converted.");
}
}
}
public class NotifyPropertyChangedAdvice : IAfterReturningAdvice, INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public void AfterReturning(object ReturnValue, MethodInfo Method, object[] Args, object Target) {
if (Method.Name.StartsWith("set_")) {
RaisePropertyChanged(Target, Method.Name.Substring("set_".Length));
}
}
private void RaisePropertyChanged(Object Target, String PropertyName) {
if (PropertyChanged != null)
PropertyChanged(Target, new PropertyChangedEventArgs(PropertyName));
}
}
我正在代理的对象如下所示
public class ProxyTypeObject : ObservableObject {
private string whoCaresItsBroke;
public string WhoCaresItsBroke {
get { return whoCaresItsBroke; }
set {
whoCaresItsBroke = value;
RaisePropertyChanged("WhoCaresItsBroke");
}
}
}
以及调用代码
var pto = new ProxyTypeObject();
pto.WhoCaresItsBroke = "BooHoo";
pto.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => {
return;
};
var proxy = AopProxyFactory.GetProxy(pto);
(proxy as ProxyTypeObject).WhoCaresItsBroke = "BooHoo2";
您会注意到,当我设置“WhoCaresItsBroke”属性时,我之前连接的属性更改处理程序永远不会被命中。 (我尝试使用 spring.net 论坛中提供的 NotifyPropertyChangedAdvice,但这似乎不起作用。)
【问题讨论】:
-
您正在定义一个“AttributeMatchMethodPointcut(typeof(AttributeStoringMethod)”但您没有使用该“AttributeStoringMethod”-属性来标记哪些方法是切入点。您可以将代码的一部分发布到您实际所在的位置吗使用那个属性?
标签: c# mvvm aop spring.net mvvm-foundation