não Spring.NET não usar AOP AfterReturningAdvice
-
07-07-2019 - |
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ê?
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