程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> A2D Framework - 看如何精簡業務邏輯 - 緩存子系統

A2D Framework - 看如何精簡業務邏輯 - 緩存子系統

編輯:關於.NET

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中了:

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved