A2D Framework - 看如何精简业务逻辑 - 缓存子系统
A2D中一项功能是关于Cache的,能够将判断、获取、删除cache的代码缩减到最少量,如下是Order业务逻辑的demo示范:
interface IOrder
{
[Cachable("Order.GetMessage", "Default", ExpireType = CacheExpireType.Absolutely, Increment = )]
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 = ;
while (true)
{
if (i % ==)
o1.UpdateMessage("changed at"+DateTime.Now); //调用这个函数后,会强制delete GetMessage所对应的缓存 Thread.Sleep();
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
如何下载:
A2D Framework - 看如何精简业务逻辑 - 缓存子系统的更多相关文章
- 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法
首先需要说明的是这是.net framework的一个组件,而不是针对.net core的.目前工作比较忙,因此.net core的转换正在编写过程中,有了实现会第一时间贴出来. 接下来进入正题.对于 ...
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php.java等就是调用存储过程". ...
- 问题(bug)确实不在代码逻辑上面,往往是配置、权限或者业务逻辑之外的地方(转)
不能说所有的bug都是纸老虎,但往往那种看似很奇葩的bug,导致的原因确实很简单,烦了你一段时间,找到真相又让你忍不住一笑.什么是奇葩的bug呢.我的定义是:代码逻辑都一样,但在A处是好的,到了B处就 ...
- 从App业务逻辑中提炼API接口
2.1 从App业务逻辑中提炼API接口 业务逻辑思维导图 功能-业务逻辑思维导图 基本功能模块关系 功能模块接口UML(设计出API) 在设计稿标注API 编写API文档 2.2 设计API的要点 ...
- 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)
本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...
- 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)
https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...
- 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑
Part 3: 设计逻辑层:核心开发 如前所述,我们的解决方案如下所示: 下面我们讨论整个应用的结构,根据应用中不同组件的逻辑相关性,分离到不同的层中,层与层之间的通讯通过或者不通过限制.分层属于架构 ...
- ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑
上次搭建好了项目框架,但还是觉得不太对劲,后来才想起来没有对开发目标进行定位,这个小demo虽然不用做需求分析,但是要实现什么效果还得明确.后来想了一下就做个最简单的网站,目标定为小公司进行展示用的网 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
前言 从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...
随机推荐
- 记录一次spark连接mysql遇到的问题
版权声明:本文为博主原创文章,未经博主允许不得转载 在使用spark连接mysql的过程中报错了,错误如下 08:51:32.495 [main] ERROR - Error loading fact ...
- 一张图教你读懂AI简史
- [20181007]12cR2 Using SQL Patch 2.txt
[20181007]12cR2 Using SQL Patch 2.txt --//12cR2 已经把sql打补丁集成进入dbms_sqldiag,不是11g的 DBMS_SQLDIAG_INTERN ...
- Powershell远程执行命令
$Username = 'xx' $Password = 'xx' $ComputerName='xx' $pass = ConvertTo-SecureString -AsPlainText $Pa ...
- Android ConstraintLayout 布局警告
使用 ConstraintLayout 布局出现警告: 此视图不受垂直约束.在运行时,除非添加垂直约束,否则它将跳转到左侧 解决办法: 从Android Studio v3及更高版本开始,从下拉列表中 ...
- ini (ini-parser)配置文件解析 for donet
介绍 此ini解析库适用于mono(unity3d),donet,大小在30kb左右. 开源免费:https://github.com/rickyah/ini-parser 使用示例 engine_c ...
- VSCode 首次打开提示“Git installation not found.”解决方案
※前提大家先在本地安装好相应的git版本(下载地址:https://www.git-scm.com/download/) 一.找到“默认用户设置”
- 解决终端SSH连接服务器一段时间不操作之后卡死的问题
卡死是因为LIUNX安全设置问题,在一段时间内没有使用数据的情况下会自动断开,解决方法就是让本地或者服务器隔一段时间发送一个请求给对方即可 在本地打开配置文件(不建议在server端设置) sudo ...
- ubuntu中利用qtcreator引用opencv249及采起采集卡的共享库
opencv Link:https://github.com/opencv/opencv CqUsbCam link:https://github.com/niuxiaobaoer/CqUsbCam_ ...
- (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...