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

    输出:

    代码下载 

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/aarond/p/EventFramework.html
Copyright © 2011-2022 走看看