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
如何下载:
自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai