我正在尝试在我的项目中使用Spring.NET AOP进行日志记录,并且两个建议工作得很好,但是,第三个没有被使用。
这是我的布线:
<!-- 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>
然后我从Spring获取GraphicsContextManager实例:
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
我用来从Spring获取对象的ObjectManager的重要部分:
static ObjectManager()
{
Context = ContextRegistry.GetContext();
}
public static T GetNew<T>()
{
return (T)Context.GetObject(typeof(T).FullName);
}
Spring抛出没有异常,但也忽略了AfterAdvice。有什么想法吗? 我创建的其他建议没有任何问题。
_____________编辑:______________
我在我的ObjectManager中添加了一个重载:
public static T GetNew<T>(string typeFullName)
{
var ctx = GetContext();
return (T)ctx.GetObject(typeFullName);
}
如果我因此使用
var contextManager = ObjectManager.GetNew<IGraphicsContextManager>("GraphicsContextManager");
将Spring返回的实例转换为具体类型而不是接口,它按预期工作,我的建议被使用(是的!)。
但我不明白为什么?
答案 0 :(得分:0)
Spring.NET AOP使用动态代理:
代理机制: http://www.springframework.net/doc-latest/reference/html/aop.html#aop-proxy-mechanism
HTH, 布鲁诺