自己写框架 - 实践 (Event Framework)
2013-04-25 10:28
597 查看
要想性能高,缓存是关键,缓存处理更是关键
最近一直在关注性能方面,回想起以前写cache的场景,纠结啊,一坨一坨的同步代码,都写在了业务方法中,更要命的是由于涉及到取缓存代码导致了多个方法中同时牵涉了很多处理缓存的代码、结构性基本上没有。
由此粗略写了这个EventFramework,还没有优化,由于用到了反射,所以效率不高,还需要优化(今天刚搞出来的。。。)
代码下载
这个EventFramework能够将业务方法和相关event分离开(事件订阅),比如:
事件订阅:
Order.Add函数调用后,EventFramework能根据订阅的event,逐一进行调用(缓存处理可以放在这里,对处理缓存的结构比较可控)
DI注入:
尚不支持构造器注入,目前只有字段、属性级别的注入
举个例子
假设Order.Add后,需要更新以下多个Cache:
前台会员中心的各种Order列表Cache(可能有多个Cache Item需要更新)
后台多个订单处理员工所看到的Order列表Cache(也可能有多个Cache Item需要更新)
如果使用Event Framework,代码则如下:
然后将event贴到业务逻辑接口上
上面这种是贴标签形式做到触发event,还可以使用直接触发来触发event:
最后,表示层代码:
输出:
代码下载
最近一直在关注性能方面,回想起以前写cache的场景,纠结啊,一坨一坨的同步代码,都写在了业务方法中,更要命的是由于涉及到取缓存代码导致了多个方法中同时牵涉了很多处理缓存的代码、结构性基本上没有。
由此粗略写了这个EventFramework,还没有优化,由于用到了反射,所以效率不高,还需要优化(今天刚搞出来的。。。)
代码下载
这个EventFramework能够将业务方法和相关event分离开(事件订阅),比如:
事件订阅:
Order.Add函数调用后,EventFramework能根据订阅的event,逐一进行调用(缓存处理可以放在这里,对处理缓存的结构比较可控)
DI注入:
尚不支持构造器注入,目前只有字段、属性级别的注入
举个例子
假设Order.Add后,需要更新以下多个Cache:
前台会员中心的各种Order列表Cache(可能有多个Cache Item需要更新)
后台多个订单处理员工所看到的Order列表Cache(也可能有多个Cache Item需要更新)
如果使用Event Framework,代码则如下:
public static void ConfigEventProcessors() //这个是订阅event和event处理Processor的配置 { //Subscribe OrderAddedEvent SysRuntime.EventBus.Subscribe<OrderAddedEvent, AdminPendingOrderListCacheBuilder>(); SysRuntime.EventBus.Subscribe<OrderAddedEvent, PerUserOrderListCacheBuilder>(); //Subscribe OrderDeletedEvent SysRuntime.EventBus.Subscribe<OrderDeletedEvent, SampleOrderDeletedEventProcessor>(); //Subscribe OrderSavedEvent SysRuntime.EventBus.Subscribe<OrderSavedEvent, SampleOrderSavedEventProcessor>(); }
然后将event贴到业务逻辑接口上
public interface IOrderBusiness { [RaiseEvent(typeof(OrderSavedEvent))] //可以多个相同的event [RaiseEvent(typeof(OrderSavedEvent))] int Add(OrderEntity order); [RaiseEvent(typeof(OrderSavedEvent))] bool Save(OrderEntity order); [RaiseEvent(typeof(OrderDeletedEvent))] bool Delete(int orderId); }
上面这种是贴标签形式做到触发event,还可以使用直接触发来触发event:
public int Add(OrderEntity order) { //validate Console.WriteLine("In Add"); int newOrderId= repository.Insert(order); if (newOrderId>0) SysRuntime.EventBus.RaiseEvent<OrderAddedEvent>(order); //直接代码方式触发event return newOrderId; }
最后,表示层代码:
class Program { static void Main(string[] args) { StartupConfig.ConfigEventProcessors(); //配置event和event processor的关联 SysRuntime.Container.Register<IOrderAppFacade, OrderApplication>(); //接口和具体实现类的隔离 SysRuntime.Container.Register<IOrderBusiness, OrderComponent>(); //同上 SysRuntime.Container.Register<IOrderRepository, FakeOrderRepository>(); //同上 IOrderAppFacade orderApp = SysRuntime.Container.Resolve<IOrderAppFacade>(); //得到一个instance orderApp.AddOrder("test"); } }
输出:
代码下载
相关文章推荐
- 自己写框架 - 实践 (Event Framework)
- 《自己动手写开源框架10》:Web界面快速开发实践
- Tensorflow框架下Faster-RCNN实践(二)——用自己制作的数据训练Faster-RCNN网络(附代码)
- caffe + win10基于CaffeNet网络框架训练自己的图片进行分类(实践篇)
- C++实现自己的插件框架 基于QtCreator源码裁剪
- 基于配置的ORMapping框架浅析之2(以自己开发的框架为例子)
- Asp.Net底层原理(二、写自己的Asp.Net框架)
- 编写自己的JDBC框架
- HTML5游戏开发实践之HTML5框架的使用(一)
- 将自己的框架更新到cocopods上
- Robot Framework自己主动化測试框架之我见
- 【day 10】python编程:从入门到实践学习笔记- 基于Django框架的Web开发-Django入门(一)
- Asp.Net中实现自己的Mvc开发框架
- [Java框架-grails从基础到实践]1、grails简介
- 在使用JS框架之前自己写的一些工具代码
- Windows Azure 安全最佳实践 - 第 3 部分:确定安全框架
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
- 【day 13】python编程:从入门到实践学习笔记-基于Django框架的Web开发-Django入门(四)
- Android学习之——自己搭建Http框架(2)——框架扩展
- SSD框架训练自己的数据集