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</When> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CachePutEventHandler</Then> </ThenList> </EventPair> <EventPair> <WhenList> <When>A2DFramework.CacheService.CacheEvents.CacheRemovedEvent</When> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CacheRemovedEventHandler</Then> </ThenList> </EventPair> <!--緩存系統的事件支持 END--> </EventSetting> </A2D>
CacheStorage節點中的Storage節點可以有多個,目前只定義了一個節點:Default, 這個Default要與IOrder中的Cachable標簽中的參數對應起來
EventSetting節點不能省略,因為緩存子系統依賴於事件子系統。
本demo程序已經更新到A2D中了:
A2D Framework網址:https://a2d.codeplex.com/SourceControl/latest
如何下載: