A2D Framework 的核心優勢之一在於其緩存子系統,能將判斷、獲取、刪除緩存的樣板代碼壓縮至最小。透過在介面層以屬性標註方式宣告緩存策略,業務實作類得以保持極度精簡,完全不需撰寫任何緩存相關邏輯。
以下示範 IOrder 介面如何透過 [Cachable] 與 [CacheEvict] 屬性定義緩存行為:
interface IOrder {
[Cachable("Order.GetMessage", "Default", ExpireType = CacheExpireType.Absolutely, Increment = 5)]
string GetMessage();
[CacheEvict("Order.GetMessage", "Default")]
void UpdateMessage(string userInput);
}
業務實作類 OrderImpl 僅專注核心邏輯,GetMessage 模擬耗時運算,UpdateMessage 則更新內部狀態:
[AOPServiceEnabled]
class OrderImpl : ContextBoundObject, IOrder {
private string msg = "not changed message";
public string GetMessage() {
Thread.Sleep(2000); // 模擬重負載處理
return string.Format("{0}-{1}", msg, DateTime.Now);
}
public void UpdateMessage(string userInput) {
msg = userInput;
}
}
A2D 內建 ObjectFactory 作為 IoC 控制器,支援一般實例與單例兩種註冊模式:
ObjectFactory.Register<IOrder, OrderImpl>(); // IoC 註冊 var o1 = ObjectFactory.Resolve<IOrder>(); // 取得 IOrder 實例
主程式示範每秒呼叫 GetMessage,每 11 秒觸發一次 UpdateMessage 強制清除對應緩存:
static void Main(string[] args) {
A2DConfig.LoadConfig(); // 載入 A2D 設定檔
ObjectFactory.Register<IOrder, OrderImpl>();
var o1 = ObjectFactory.Resolve<IOrder>();
int i = 1;
while (true) {
if (i % 11 == 0)
o1.UpdateMessage("changed at" + DateTime.Now); // 觸發緩存移除
Thread.Sleep(1000);
Console.WriteLine(o1.GetMessage());
i++;
}
}

A2D 設定檔中 <CacheStorages> 定義緩存儲存策略,Location="Default" 需與介面屬性參數對應;<EventSetting> 則配置事件總線,緩存子系統依賴事件機制實現分散式同步:
<?xml version="1.0" encoding="utf-8" ?>
<A2D>
<CacheStorages>
<Storage Location="Default" Scope="PerSession">
<LocalCacheSetting>
<CacheAlgorithm>LFU</CacheAlgorithm>
<CacheCapacity>1000</CacheCapacity>
</LocalCacheSetting>
</Storage>
</CacheStorages>
<EventSetting>
<Identifier>app server name 1</Identifier>
<EventServer>
<Enabled>false</Enabled>
<Address>127.0.0.1</Address>
<Port>202020</Port>
</EventServer>
<!-- 緩存事件訂閱:CachePutEvent / CacheRemovedEvent -->
</EventSetting>
</A2D>
此架構達到「業務邏輯零緩存代碼、介面層聲明式配置、運行時自動攔截」的三重優勢,極大提升開發效率與代碼可維護性。
