A2D中一項功能是關於Cache的,能夠將判斷、獲取、刪除cache的代碼縮減到 最少量,如下是Order業務邏輯的demo示范:
interface IOrder { [Cachable("Order.GetMessage", "Default", ExpireType = CacheExpireType.Absolutely, Increment = 5)] string GetMessage(); [CacheEvict("Order.GetMessage", "Default")] void UpdateMessage(string userInput); } [AOPServiceEnabled] class OrderImpl : ContextBoundObject, IOrder { private string msg = "not changed message"; public string GetMessage() { Thread.Sleep(2000); //模仿重負載處理,延時2秒 return string.Format("{0}-{1}", msg, DateTime.Now); } public void UpdateMessage(string userInput) { msg = userInput; } }
在OrderImpl(業務邏輯實現類)中,沒有看到判斷、更新、獲取cache的代碼 ,非常簡潔(控制cache的代碼寫在了接口部分)。
那如何調用這個Order邏輯呢?
ObjectFactory.Register<IOrder, OrderImpl>(); //IoC注冊
var o1 = ObjectFactory.Resolve<IOrder>(); //獲取IOrder實例
ObjectFactory是A2D的IoC控制器,能進行兩種方式的注入:普通Instance以 及單例。
看看主demo程序:
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); //調用這個函數後,會強制delete GetMessage所對應的緩存 Thread.Sleep(1000); Console.WriteLine(o1.GetMessage()); i++; } }
運行效果圖:
下面是A2D的配置文件:
<?xml version="1.0" encoding="utf-8" ?> <A2D> <CacheStorages> <Storage Location="Default" Scope="PerSession"> <!--PerSession/Global--> <!--相當於1級緩存(本地, 沒有網絡I/O)--> <LocalCacheSetting> <CacheAlgorithm>LFU</CacheAlgorithm><!--LFU/LRU/None--> <CacheCapacity>1000</CacheCapacity> </LocalCacheSetting> </Storage> </CacheStorages> <EventSetting> <!--客戶端的名稱,需要發往event server--> <Identifier>app server name 1</Identifier> <RetryConnectInterval>1000</RetryConnectInterval> <!--要連接的event server信息--> <EventServer> <Enabled>false</Enabled> <Address>127.0.0.1</Address> <Port>202020</Port> </EventServer> <!--訂閱的事件以及響應事件的class type定義--> <!--緩存系統的事件支持 START--> <EventPair> <WhenList> <When>A2DFramework.CacheService.CacheEvents.CachePutEvent</Whe n> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CachePutEventH andler</Then> </ThenList> </EventPair> <EventPair> <WhenList> <When>A2DFramework.CacheService.CacheEvents.CacheRemovedEvent< /When> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CacheRemovedEv entHandler</Then> </ThenList> </EventPair> <!--緩存系統的事件支持 END--> </EventSetting> </A2D>
CacheStorage節點中的Storage節點可以有多個,目前只定義了一個節點: Default, 這個Default要與IOrder中的Cachable標簽中的參數對應起來
EventSetting節點不能省略,因為緩存子系統依賴於事件子系統。
本demo程序已經更新到A2D中了:
查看本欄目