2009-09-13 102 views
0

我正在使用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(); 
    } 
} 

我是否應用方面的錯誤的方式?

+0

@Mato:只要檢查method.IsStatic,如果條件的其他!你確定這個方面是否被賦值並且不被這些條件語句阻擋? – 2009-09-13 20:15:05

+0

爲什麼不使用NHibernate/ActiveRecord的常規攔截機制? (重寫OnSave()或FindDirty(),IInterceptor,事件偵聽器) – 2009-09-14 01:04:25

+0

@David Andres:CommitOnSaveSubAspect在foreach循環外部應用,所以條件語句不會影響這個。 @Mauricio Scheffer:我不想將代碼傳播到很多類,因爲這種方式的可重用性更好。不這樣做的另一個原因是,在我看來,這不會支持AOP。 – Mato 2009-09-14 16:38:44

回答

2

調試一個方面的一個好方法是使用Reflector查看生成的程序集。方法是否按預期提高?

您也可以通過把一個斷點到它運行的MSBuild使用以下命令行調試ProvideAspects方法:

msbuild /p:PostSharpAttachDebugger=true 
+0

好的,它看起來像方法沒有按預期增強(它根本不會改變)。但調試器顯示getMethod(「保存」)找到該方法並返回正確的MethodInfo。問題是這個方法是虛擬的嗎?當我重寫類中的方法時,我正在將該屬性應用於方法得到增強。 – Mato 2009-09-14 18:06:38

+0

將方面添加到虛擬方法時,該方面將應用於您使用方面註釋的精確方法。有關適用於覆蓋的方面的詳細信息,請參閱http://doc.postsharp.org/1.5/##PostSharp.HxS/UserGuide/Laos/Multicasting/Inheritance.html。 – 2009-09-15 11:07:04