2010-09-22 23 views
1

我想實現一個非常基本的Spring.Net的建議之前,只是打印一些信息到控制檯。下面是Spring配置的相關部分:Spring.Net之前建議不工作

<!-- Before Advice: Method Logging --> 
    <object id="methodLoggingBeforeAdvice" 
    type="Ch.Test.AddressBook.Common.Advice.MethodLoggingBeforeAdvice" /> 

    <!-- Program Proxy w/ Advice Applied --> 
    <object id="programProxy" 
    type="Spring.Aop.Framework.ProxyFactoryObject"> 
    <property name="target" ref="programProxyTarget" /> 
    <property name="interceptorNames"> 
     <list> 
     <value>methodLoggingBeforeAdvice</value> 
     </list> 
    </property> 
    </object> 

    <!-- Target, which the advice is applied to --> 
    <object id="programProxyTarget" 
    type="Ch.Test.AddressBook.Ui.ConsoleUi.Program"> 
    <constructor-arg ref="repository"/> 
    </object> 

這裏是建議:

public class MethodLoggingBeforeAdvice : IMethodBeforeAdvice 
{ 

    public void Before(MethodInfo method, Object[] args, Object target) 
    { 
     // Log method start 
     Console.Out.WriteLine(
      "MethodLoggingBeforeAdvice: Entering method '" 
      + method.Name + "'"); 

     // Log method arguments 
     for (int i = 0; i < args.Length; i++) 
     { 
      Console.Out.WriteLine("MethodLoggingBeforeAdvice: Argument " + (i + 1) 
       + " - " + args[0].ToString()); 
     } 
    } 
} 

一切都建立精細,應用程序正在運行,程序類被實例化和方法的調用,但是有不是從建議中輸出的。我似乎無法弄清楚爲什麼......先謝謝了!

回答

2

我覺得很蠢。

我發佈的代碼是可以的。問題在於對象的初始化。這是我用:

var program = (Program)ContextRegistry.GetContext().GetObject("program"); 
program.StartUp(); 

我實際上應該已經賺得使用,而不是建議的programProxy-對象:

var program = (Program)ContextRegistry.GetContext().GetObject("programProxy"); 
program.StartUp(); 
2

你也可以使用匿名的內部對象,所以你不會意外得到一個無人看管的物體:

<!-- Before Advice: Method Logging --> 
    <object id="methodLoggingBeforeAdvice" 
    type="Ch.Test.AddressBook.Common.Advice.MethodLoggingBeforeAdvice" /> 

    <!-- Program Proxy w/ Advice Applied using an anonymous inner object--> 
    <object id="program" 
    type="Spring.Aop.Framework.ProxyFactoryObject"> 
    <property name="target"> 
     <object type="Ch.Test.AddressBook.Ui.ConsoleUi.Program"> 
      <constructor-arg ref="repository"/> 
     </object> 
    </property> 
    <property name="interceptorNames"> 
     <list> 
     <value>methodLoggingBeforeAdvice</value> 
     </list> 
    </property> 
    </object> 
+0

不錯,我不知道。對於僅使用一次的目標對象來說很有用。 – Christopher 2011-05-25 06:58:41