2010-12-20 31 views
0

下面的方法稱爲攔截方法的情況:從同一個對象

/// <summary> 
/// A business logic class. 
/// </summary> 
public class BusinessClassWithInterceptor : BusinessClass, IBusinessClass 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="BusinessClassWithoutInterceptor"/> class. 
    /// </summary> 
    /// <param name="logger">The logger.</param> 
    public BusinessClassWithInterceptor(Logger logger) 
     : base(logger) 
    { 
    } 

    /// <summary> 
    /// Displays all cows. 
    /// </summary> 
    public void DisplayAllCows() 
    { 
     this.Logger.Write("Displaying all cows:"); 
     var repository = new CowRepository(); 
     foreach (CowEntity cow in repository.GetAllCows()) 
     { 
      this.Logger.Write(" " + cow); 
     } 
    } 

    /// <summary> 
    /// Inserts a normande. 
    /// </summary> 
    public void InsertNormande(int id, string name) 
    { 
     this.DisplayAllCows(); 

     var repository = new CowRepository(); 
     repository.InsertCow(new CowEntity { Id = id, Name = name, Origin = CowOrigin.Normandie }); 
    } 
} 

隨着溫莎城堡,這個類配置爲與這個攔截器攔截:

/// <summary> 
/// Interceptor for logging business methods. 
/// </summary> 
public class BusinessLogInterceptor : IInterceptor 
{ 
    /// <summary> 
    /// Intercepts the specified invocation. 
    /// </summary> 
    /// <param name="invocation">The invocation.</param> 
    public void Intercept(IInvocation invocation) 
    { 
     Logger logger = ((IBusinessClass)invocation.InvocationTarget).Logger; 

     var parameters = new StringBuilder(); 
     ParameterInfo[] methodParameters = invocation.Method.GetParameters(); 
     for (int index = 0; index < methodParameters.Length; index++) 
     { 
      parameters.AppendFormat("{0} = {1}", methodParameters[index].Name, invocation.Arguments[index]); 
      if (index < methodParameters.Length - 1) 
      { 
       parameters.Append(", "); 
      } 
     } 

     logger.Format("Calling {0}({1})", invocation.Method.Name, parameters.ToString()); 
     invocation.Proceed(); 
     logger.Format("Exiting {0}", invocation.Method.Name); 
    } 
} 

問題發生期間致電InsertNormande。 到InsertNormande電話是很好截獲,但調用DisplayAllCows在InsertNormande不攔截...

這真的令我煩惱。

有沒有辦法在這種情況下實現攔截?

回答

0

我不認爲有這樣做的簡單方法......類的內部方法調用不能被攔截,因爲它們不通過代理。

你可以實現通過其他手段的所有方法,比如像PostSharp

+0

哇,這是令人失望的......不幸的是,PostSharp是不是免費的,其許可政策是相當痛苦的AOP框架日誌記錄。 – Roubachof 2010-12-20 13:17:58

+1

大部分是正確的。你實際上可以攔截相同對象的調用,但只能用於類代理(假設該方法是虛擬的)。接口代理是通過包裝代理目標對象創建的,所以Thomas指出它們並不是真正針對像你描述的那種場景。 – 2010-12-20 13:49:17

+0

謝謝!類代理正在完成這項工作。我們的例子中的接口並不重要,所以我們放棄了它們。 – Roubachof 2010-12-20 15:46:39