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不攔截...
這真的令我煩惱。
有沒有辦法在這種情況下實現攔截?
哇,這是令人失望的......不幸的是,PostSharp是不是免費的,其許可政策是相當痛苦的AOP框架日誌記錄。 – Roubachof 2010-12-20 13:17:58
大部分是正確的。你實際上可以攔截相同對象的調用,但只能用於類代理(假設該方法是虛擬的)。接口代理是通過包裝代理目標對象創建的,所以Thomas指出它們並不是真正針對像你描述的那種場景。 – 2010-12-20 13:49:17
謝謝!類代理正在完成這項工作。我們的例子中的接口並不重要,所以我們放棄了它們。 – Roubachof 2010-12-20 15:46:39