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

如何下载:

 

 

 

posted @ 2013-12-05 00:44  McKay  阅读(2317)  评论(2编辑  收藏  举报