2009-09-13 3 views
0

J'utilise PostSharp pour appliquer un CompoundAspect à une classe ActiveRecord (à partir de CastleProject). Le code ressemble à ceci:PostSharp: OnMethodBoundaryAspect n'est pas appelé

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()); 
      } 
     } 
    } 
} 

Tout fonctionne très bien, à l'exception du CommitOnSaveSubAspect qui est un OnMethodBoundaryAspect. La méthode OnSuccess n'est jamais appelée lorsque la méthode Save est appelée. J'ai déjà essayé de déplacer le code sur OnEntry et OnExit mais la même situation ici.

La classe CommitOnSaveSubAspect ressemble à ceci:

[Serializable] 
class CommitOnSaveSubAspect : OnMethodBoundaryAspect 
{ 
    public override void OnSuccess(MethodExecutionEventArgs eventArgs) 
    { 
     ((IRevertible)eventArgs.Instance).Commit(); 
    } 
} 

Suis-je appliquer l'aspect de la mauvaise façon?

+0

@Mato: vérification Juste que method.IsStatic et l'autre si les conditions!. Êtes-vous sûr que l'aspect est assigné et n'est pas retenu par ces déclarations conditionnelles? –

+0

Pourquoi ne pas simplement utiliser les mécanismes d'interception réguliers de NHibernate/ActiveRecord? (override OnSave() ou FindDirty(), IInterceptor, écouteurs d'événements) –

+0

@David Andres: Le CommitOnSaveSubAspect est appliqué en dehors de la boucle foreach, donc les instructions conditionnelles n'affectent pas cela. @Mauricio Scheffer: Je ne veux pas passer le code à de nombreuses classes car la réutilisabilité est meilleure de cette façon. Une autre raison de ne pas faire cela est que, à mon avis, ce ne serait pas AOP propper. – Mato

Répondre

0

PostSharp at-il été défini globalement lorsque vous l'avez installé? Sinon, vous devrez éditer vos fichiers de projet pour que PostSharp soit injecté correctement dans vos assemblys.

Voir http://doc.postsharp.org/1.0/Default.aspx##PostSharp.HxS/UserGuide/Platform/EnablingPostSharp.html.

+0

PostSharp a été défini globalement lorsque je l'ai installé. Si cela n'avait pas été défini globalement, aucun des codes ci-dessus ne fonctionnerait. Mais c'est seulement le CommitOnSaveSubAspect qui ne fonctionne pas. – Mato

2

Une bonne façon de déboguer un aspect consiste à regarder l'assemblage résultant en utilisant Reflector. Les méthodes sont-elles améliorées comme vous le souhaitez?

Vous pouvez également déboguer la méthode ProvideAspects en mettant un point d'arrêt en cours d'exécution et msbuild avec la ligne de commande suivante:

msbuild /p:PostSharpAttachDebugger=true 
+0

OK, il semble que la méthode ne soit pas améliorée comme prévu (elle ne change pas du tout). Mais le débogueur montre que getMethod ("Enregistrer") trouve la méthode et renvoie le MethodInfo correct. Le problème pourrait-il être que la méthode est virtuelle? Quand je surmonte le mode dans la classe j'applique l'attribut à la méthode est amélioré comme prévu. – Mato

+0

Lorsque vous ajoutez un aspect à une méthode virtuelle, l'aspect est appliqué à la méthode précise que vous avez annotée avec l'aspect. Voir http://doc.postsharp.org/1.5/##PostSharp.HxS/UserGuide/Laos/Multicasting/Inheritance.html pour plus de détails sur les aspects qui s'appliquent également aux remplacements. –

Questions connexes