Frage

Ich versuche, für die Anmeldung Zweck Spring.NET AOP in meinem Projekt zu verwenden und zwei Ratschläge großartige Arbeit, jedoch die dritte überhaupt nicht gewöhnen.

Hier ist meine Verkabelung:

<!-- 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>

ich dann bekommen die GraphicsContextManager Instanz von 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

Die wichtigen Teile des Object ich Objekte von Spring benutzen Sie:

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

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

Frühling wirft keine Ausnahme, sondern die AfterAdvice wird auch ignoriert. Irgendwelche Ideen, warum? Andere Beratung erstellt Ich habe Arbeit ohne Probleme.


_____________ EDIT: ______________

Ich habe eine Überlastung meiner Object:

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

Wenn ich also mit

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

Casting die Instanz zurück von Spring nicht auf seinen konkreten Typen, sondern auf eine Schnittstelle, es funktioniert wie erwartet, und mein Rat verwendet wird (yay!).

Aber ich verstehe nicht, warum?

War es hilfreich?

Lösung

Spring.NET AOP verwendet dynamische Proxies:

  • Wenn Sie Ihre Zielklasse eine Schnittstelle implementiert, wird implementieren die Proxy die Schnittstelle und delegieren ruft zum Zielobjekt
  • Wenn Sie Ihre Zielklasse keine Schnittstelle implementieren, wird der Proxy die Zielklasse außer Kraft setzen, so dass Sie als virtuelle Ihre Methode markieren müssen durch den Proxy overrided werden.

Proxying Mechanismen: http://www.springframework.net/ doc-latest / reference / html / aop.html # AOP-Proxy-Mechanismus

HTH, Bruno

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top