zoukankan      html  css  js  c++  java
  • 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

    如何下载:

  • 相关阅读:
    上一篇、下一篇之实现思路
    sql优化
    简易的文件上传 tp5
    phpqrcode生成二维码
    php 发送邮件(2)qq邮箱开通
    php 发送邮件(1)代码逻辑
    SELECT list is not in GROUP BY clause and contains nonaggregated
    TP5 未定义变量:XXX
    CentOS 7下载
    FFT算法实现——基于GPU的基2快速傅里叶变换
  • 原文地址:https://www.cnblogs.com/aarond/p/A2DCache.html
Copyright © 2011-2022 走看看