MVVM Foundation과 함께 Spring.Net 1.3.1을 사용하여 내 viewmodels에 교차 절단을 적용하고 있습니다. 객체가 크로스 커팅 (cross-cutting)을 위해 프록시로 변환되기 전에 프록시가 속성 변경 핸들러를 프록시에 적용하지 않기 전에 프로퍼티 변경 핸들러를 할당했다는 것을 알았습니다. 아무도 이것이 예상되는 동작인지 그리고 만약 그렇다면 해결 방법이 있는지 알고 있습니까?봄 AOP + MVVM 재단 + PropertyChanged
는 내 공장은 조언 내가이
public class ProxyTypeObject : ObservableObject {
private string whoCaresItsBroke;
public string WhoCaresItsBroke {
get { return whoCaresItsBroke; }
set {
whoCaresItsBroke = value;
RaisePropertyChanged("WhoCaresItsBroke");
}
}
}
같은 모양과 호출 코드를 프록시있어이
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 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();
}
}
처럼 보이는
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"-Attribut을 사용하여 어떤 메소드가 pointcuts인지 표시하지 않습니다. 실제로 해당 속성을 사용하고있는 코드 부분을 게시 할 수 있습니까? – tobsen