我正在使用PostSharp將CompoundAspect應用於ActiveRecord類(來自CastleProject)。代碼如下所示: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());
}
}
}
}
一切工作正常,除了CommitOnSaveSubAspect這是一個OnMethodBoundaryAspect。在調用Save方法時,OnSuccess方法永遠不會被調用。我已經嘗試將代碼移到OnEntry和OnExit,但是這裏的情況相同。
的CommitOnSaveSubAspect類看起來是這樣的:
[Serializable]
class CommitOnSaveSubAspect : OnMethodBoundaryAspect
{
public override void OnSuccess(MethodExecutionEventArgs eventArgs)
{
((IRevertible)eventArgs.Instance).Commit();
}
}
我是否應用方面的錯誤的方式?
@Mato:只要檢查method.IsStatic,如果條件的其他!你確定這個方面是否被賦值並且不被這些條件語句阻擋? – 2009-09-13 20:15:05
爲什麼不使用NHibernate/ActiveRecord的常規攔截機制? (重寫OnSave()或FindDirty(),IInterceptor,事件偵聽器) – 2009-09-14 01:04:25
@David Andres:CommitOnSaveSubAspect在foreach循環外部應用,所以條件語句不會影響這個。 @Mauricio Scheffer:我不想將代碼傳播到很多類,因爲這種方式的可重用性更好。不這樣做的另一個原因是,在我看來,這不會支持AOP。 – Mato 2009-09-14 16:38:44