AOP
AOP(Aspect Orient Programming),面向方面(切面)編程,是OOP面向對象的一種補充。OOP將對象進行模塊划分,獨立處理,而AOP則是將模塊間各種橫切關注點集合起來處理,比如事務管理、日志、緩存等等。AOP實現主要分為靜態代理和動態代理。
何為切面
一個與業務代碼沒有任何耦合的代碼段。如日志記錄,發送郵件等等。一切能為代碼所有且能和代碼充分解耦的代碼都可以作為一個業務代碼的切面。
AOP使用場景:
我們提交一個訂單的時候,在提交前需要對參數進行校驗,在提交后對訂單進行日志記錄。
static void Submit(Order order)
{
IOrderHandle orderHandle = new OrderHandle();
//參數校驗
Console.WriteLine("參數校驗");
orderHandle.Submit(order);
//日志記錄
Console.WriteLine("日記記錄");
}
上面就是典型的面向過程的寫法,在每一個執行方法的前和后都需要寫重復的代碼,重復的操作,當系統越來越龐大,這種重復的代碼就越多,修改起來就困難重重,牽一發而動全身。這時候就需要引入AOP來解決這些重復性的操作。
AOP-靜態代理:
靜態代理的意思是通過編寫代理類,重寫相應的業務類,在執行的前后執行相關操作。在編譯的時候直接調用代理類來執行。
繼續上面的提交訂單例子:
1、定義訂單類
public class Order
{
/// <summary>
/// 金額
/// </summary>
public double Amount { get; set; }
/// <summary>
/// 數量
/// </summary>
public int Number { get; set; }
/// <summary>
/// 商品名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 單價
/// </summary>
public int Price { get; set; }
}
2、定義訂單處理接口:
public interface IOrderHandle
{
void Submit(Order order);
}
3、實現訂單處理接口
public class OrderHandle : IOrderHandle
{
public void Submit(Order order)
{
Console.WriteLine("提交訂單");
}
}
4、編寫訂單處理代理類
構造函數引入OrderHandle,重新實現Submit方法,在調用之后增加對應的代碼處理。
public class OrderHandleProxy : IOrderHandle
{
private IOrderHandle _orderHandle;
public OrderHandleProxy(IOrderHandle orderHandle)
{
_orderHandle = orderHandle;
}
public void Submit(Order order)
{
PreSubmit(order);
_orderHandle.Submit(order);
AfterSubmit(order);
}
private void PreSubmit(Order order)
{
Console.WriteLine("提交訂單前進行數據校驗");
}
private void AfterSubmit(Order order)
{
Console.WriteLine("提交訂單后進行日志記錄");
}
}
5、調用代理類
static void Main(string[] args)
{
#region 靜態代理
Order order = new Order { Amount = 2000, Number = 200 };
OrderHandleProxy orderHandleInterceptor = new OrderHandleProxy(new OrderHandle());
orderHandleInterceptor.Submit(order);
#endregion
Console.ReadKey();
}
6、輸出
小結:
AOP本質上通過裝飾者模式,增加原有業務類的功能,實現了橫向切面的功能。
缺點:每一個業務類都需要手寫一個代理類。因此就需要動態代理,通過給方法打屬性等等方法在編譯的時候動態生成代理類。