저는 PostSharp를 사용하여 CompoundAspect를 (CastleProject의) ActiveRecord 클래스에 적용하려고합니다. 코드는 다음과 같습니다PostSharp : OnMethodBoundaryAspect가 호출되지 않습니다.
public override void ProvideAspects(object targetElement, LaosReflectionAspectCollection collection)
{
Type targetType = (Type)targetElement;
RevertibleSubAspect revertible = new RevertibleSubAspect();
revertible.Cascade = this.Cascade;
collection.AddAspect(targetType, revertible);
//This isn't working
MethodInfo saveMethod = targetType.GetMethod("Save");
collection.AddAspect(saveMethod, new CommitOnSaveSubAspect());
foreach (PropertyInfo property in targetType.GetProperties())
{
if((this.Only != null && this.Only.IndexOf(property.Name) == -1) ||
(this.Except != null && this.Except.IndexOf(property.Name) > -1))
{
continue;
}
if (property.DeclaringType == targetType && property.CanWrite)
{
MethodInfo method = property.GetSetMethod();
if (method != null && !method.IsStatic)
{
collection.AddAspect(method, new TrackInitialPropertyValuesSubAspect());
}
}
}
}
모든 것은 OnMethodBoundaryAspect 인 CommitOnSaveSubAspect 제외하고 잘 작동합니다. OnSuccess 메서드는 Save 메서드가 호출 될 때 호출되지 않습니다. OnEntry와 OnExit로 코드를 옮겨 보았습니다 만, 여기서도 같은 상황입니다.
CommitOnSaveSubAspect 클래스는 다음과 같습니다
[Serializable]
class CommitOnSaveSubAspect : OnMethodBoundaryAspect
{
public override void OnSuccess(MethodExecutionEventArgs eventArgs)
{
((IRevertible)eventArgs.Instance).Commit();
}
}
오전 내가 잘못된 방향으로 화면을 적용?
@Mato을! 그냥 그 method.IsStatic 및 조건의 경우 다른 확인. 이 조건문에 의해 양상이 지정되었거나 되돌려지지 않았습니까? –
그냥 왜 NHibernate/ActiveRecord의 정기적 인 차단 메커니즘을 사용하지 않습니까? (OnSave() 또는 FindDirty(), IInterceptor, 이벤트 리스너 무시) –
@David Andres : CommitOnSaveSubAspect는 foreach 루프 외부에 적용되므로 조건문은이 설정에 영향을주지 않습니다. @Mauricio Scheffer : 코드 재사용 성이 이렇게 좋기 때문에 코드를 여러 클래스에 보급하고 싶지 않습니다. 이 일을하지 않는 또 다른 이유는 내 의견으로는 이것이 프로퍼티 AOP가되지 않는다는 것입니다. – Mato