Pergunta

Eu estou tentando usar Spring.NET AOP no meu projeto para a exploração madeireira propósito, e dois conselhos funcionam muito bem, no entanto, o terceiro não se acostumar a todos.

Aqui está a minha fiação:

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

Eu, então, obter a instância GraphicsContextManager a partir da Primavera:

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

As partes importantes do uso ObjectManager I para obter objetos a partir da Primavera:

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

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

Spring lança nenhuma exceção, mas a AfterAdvice é ignorado também. Alguma idéia por que? Outro conselho que eu criei fez um trabalho sem problemas.


_____________ EDIT: ______________

Eu adicionei uma sobrecarga à minha ObjectManager:

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

Se, portanto, eu uso

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

Fundição a instância retornado pela Primavera não ao seu tipo concreto, mas sim a uma interface, ele funciona como esperado e meu conselho é usada (yay!).

Mas eu não entendo por quê?

Foi útil?

Solução

Spring.NET AOP utiliza proxies dinâmicos:

  • Se seus implementos classe alvo de uma interface, o proxy irá implementar a interface e delegar chamadas para o objeto de destino
  • Se a sua classe de destino não implementa uma interface, o proxy irá substituir a classe alvo assim que você precisa para marcar como virtual o seu método a ser overrided pelo proxy.

mecanismos de proxy: http://www.springframework.net/ doc-latest / referência / html / aop.html # aop-proxy-mecanismo

HTH, Bruno

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top