要想性能高,緩存是關鍵,緩存處理更是關鍵
最近一直在關注性能方面,回想起以前寫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"); } }
輸出: