zoukankan      html  css  js  c++  java
  • 自己写框架 实践 (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");
            }
        }
    复制代码

    输出:

    代码下载 

    自省推动进步,视野决定未来。
    心怀远大理想。
    为了家庭幸福而努力。
     
  • 相关阅读:
    测试报告M2
    11.24Daily Scrum(4)
    11.24Daily Scrum(3)
    11.24Daily Scrum(2)
    11.24Daily Scrum
    11.22Daily Scrum(2)
    11.22Daily Scrum
    Echarts中graph类型的运用求教
    Echarts学习求教
    用node编写自己的cli工具
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3042665.html
Copyright © 2011-2022 走看看