AOP 是 OOP(物件導向)一個變化程式撰寫思想。(非取代OOP而是擴充)
導入AOP幫助: 可幫我們分離核心邏輯跟非核心邏輯代碼,很好降低模組間耦合性,已便日後擴充。
非核心邏輯代碼像:(日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來)
例如下圖:
原本寫法把寫日誌相關程式寫入,業務邏輯方法中。導致此方法非單一職則。我們可以把程式重構改寫成(右圖),將寫日誌方法抽離出來更有效達成模組化。
經典例子:
Asp.Net MVC中Contoller,Action過濾器(FilterAttribute)
AwesomeProxy.Net 主要是攔截方法處理
- 方法執行前
- 方法執行後
- 方法異常
使用方法類似於Asp.Net MVC中Contoller,Action過濾器
- 撰寫一個標籤(Attribute) 標記攔截動作
public class CacheAttribute : AopBaseAttribute
{
public string CacheName { get; set; }
public override void OnExcuting(ExcuteingContext context)
{
object cacheObj = CallContext.GetData(CacheName);
if (cacheObj != null)
{
context.Result = cacheObj;
}
}
public override void OnExcuted(ExcutedContext context)
{
CallContext.SetData(CacheName, context.Result);
}
}
- 將要被攔截類別繼承於MarshalByRefObject類別
public class CacheService : MarshalByRefObject
{
[Cache]
public string GetCacheDate()
{
return DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");
}
}
- 由ProxyFactory.GetProxyInstance 動態產生被代理類別
CacheService cache = ProxyFactory.GetProxyInstance<CacheService>();
4.直接呼叫方法就可執行標籤上的攔截動作
CacheService cache = ProxyFactory.GetProxyInstance<CacheService>();
Console.WriteLine(cache.GetCacheDate());
Simple Code:
撰寫Log 權限驗證 快取
Unit Test 結果
2018-11-26 發布至Nuget上
Nuget:AwesomeProxy.Net