Question

J'essaie d'utiliser Spring.NET AOP dans mon projet à des fins de journalisation. Deux conseils donnent d'excellents résultats, mais le troisième ne s'habitue pas du tout.

Voici mon câblage:

<!-- the "After" Advice -->
<object id="GraphicsContextManagerAfter" type="PicturetoolWeb.App.Advice.GraphicsContextManagerAfter, PicturetoolWeb.App">
</object>

<!-- The Proxy -->
<object id="PicturetoolWeb.ImageLib.Context.GraphicsContextManager" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop">
<property name="target" ref="GraphicsContextManagerTarget"/>
<property name="interceptorNames">
    <list>
        <value>GraphicsContextManagerAfter</value>
    </list>    
</property>  
</object>

Je récupère ensuite l'instance GraphicsContextManager auprès de Spring:

var manager = ObjectManager.GetNew<GraphicsContextManager>();
// manager IS a proxy and has the advice set!

var x = manager.DoSomeStuff(); 
// the DoSomeStuff Method is invoked, but my After advice is ignored

Principales parties d'ObjectManager que j'utilise pour extraire des objets de Spring:

    static ObjectManager()
    {
        Context = ContextRegistry.GetContext();
    }

    public static T GetNew<T>()
    {
        return (T)Context.GetObject(typeof(T).FullName);
    }

Spring ne lance aucune exception, mais AfterAdvice est également ignoré. Des idées pourquoi? Les autres conseils que j'ai créés ont fonctionné sans problème.



_____________ EDIT: ______________

J'ai ajouté une surcharge à mon ObjectManager:

    public static T GetNew<T>(string typeFullName)
    {
        var ctx = GetContext();
        return (T)ctx.GetObject(typeFullName);
    }

Si j'utilise donc

var contextManager = ObjectManager.GetNew<IGraphicsContextManager>("GraphicsContextManager");

En transformant l'instance renvoyée par Spring non pas dans son type concret, mais plutôt dans une interface, cela fonctionne comme prévu et mon conseil est utilisé (oui!).

Mais je ne comprends pas pourquoi?

Était-ce utile?

La solution

Spring.NET AOP utilise des proxies dynamiques:

  • Si votre classe cible implémente une interface, le proxy l'implémentera et déléguera les appels à l'objet cible
  • Si votre classe cible n'implémente pas d'interface, le proxy remplacera la classe cible. Vous devez donc marquer comme virtuelle votre méthode à remplacer par le proxy.

Mécanismes de procuration: http://www.springframework.net/ doc-latest / reference / html / aop.html # mécanisme aop-proxy

HTH, Bruno

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top