好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

自己写框架 实践 (Event Framework)

自己写框架 实践 (Event Framework)

自己写框架 - 实践 (Event Framework)

要想性能高,缓存是关键,缓存处理更是关键

最近一直在关注性能方面,回想起以前写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  "  );
        }
    } 

输出:

代码下载  

自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。

 

分类:  AOP ,  IoC/DI ,  可扩展 ,  性能分析 ,  性能优化

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于自己写框架 实践 (Event Framework)的详细内容...

  阅读:45次