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


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

如何下載:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM