動手造輪子 實現乙個簡單的 EventBus

2022-01-10 08:55:06 字數 3693 閱讀 3840

eventbus 是一種事件發布訂閱模式,通過 eventbus 我們可以很方便的實現解耦,將事件的發起和事件的處理的很好的分隔開來,很好的實現解耦。 微軟官方的示例專案 eshoponcontainers 也有在使用 eventbus 。

這裡的 eventbus 實現也是參考借鑑了微軟 eshoponcontainers 專案。

eventbus 處理流程:

微服務間使用 eventbus 實現系統間解耦:

借助 eventbus 我們可以很好的實現元件之間,服務之間,系統之間的解耦以及相互通訊的問題。

起初覺得 eventbus 和 mq 其實差不多嘛,都是通過非同步處理來實現解耦合,高效能。後來看到了下面這張圖才算明白為什麼要用 eventbus 以及 eventbus 和 mq 之間的關係,eventbus 是抽象的,可以用mq來實現 eventbus.

解耦合(輕鬆的實現系統間解耦)

高效能可擴充套件(每乙個事件都是簡單獨立且不可更改的物件,只需要儲存新增的事件,不涉及其他的變更刪除操作)

系統審計(每乙個事件都是不可變更的,每乙個事件都是可追溯的)

來看乙個使用示例,完整**示例:

internal class eventtest

); eventbus.unsubscribe();

eventbus.unsubscribe>();

eventbus.publish(new counterevent );

}}internal class counterevent : eventbase

}internal class countereventhandler1 : ieventhandler, handler type:");

return task.completedtask;

}}internal class countereventhandler2 : ieventhandler, handler type:");

return task.completedtask;}}

eventstoreinmemory 實現:

eventstoreinmemory 是ieventstore將資料放在記憶體中的實現,使用了 concurrentdictionary 以及 hashset 來盡可能的保證高效,具體實現**如下:

public class eventstoreinmemory : ieventstore

else);}

}public bool clear()

public icollectiongeteventhandlertypes() where tevent : ieventbase

return new type[0];

}public string geteventkey()

public bool hassubscriptionsforevent() where tevent : ieventbase

public bool removesubscription()

where tevent : ieventbase

where teventhandler : ieventhandler

return false;}}

eventbus 的實現,從上面可以看到 eventstore 儲存的是ieventhandler對應的 type,在 publish 的時候根據 type 從 ioc 容器中取得相應的 handler 即可,如果沒有在 ioc 容器中找到對應的型別,則會嘗試建立乙個型別例項,然後呼叫ieventhandlerhandle方法,**如下:

/// /// eventbus in process

///

public class eventbus : ieventbus

public bool publish(tevent @event) where tevent : ieventbase

var handlers = _eventstore.geteventhandlertypes();

if (handlers.count > 0)

}catch (exception ex)

] error, eventhandlertype:");}}

handlertasks.whenall().configureawait(false);

return true;

}return false;

}public bool subscribe()

where tevent : ieventbase

where teventhandler : ieventhandler

public bool unsubscribe()

where tevent : ieventbase

where teventhandler : ieventhandler

}

來看乙個實際的專案中的使用,在我的活動室預約專案中有乙個公告的模組,訪問公告詳情頁面,這個公告的訪問次數加1,把這個訪問次數加1改成了用 eventbus 來實現,實際專案**:

定義 event 以及 eventhandler

public class noticeviewevent : eventbase

// userid

// ip

// ...

}public class noticevieweventhandler : ieventhandler);}}

這裡的 event 只定義了乙個 noticeid ,其實也可以把請求資訊如ip/ua等資訊加進去,在 eventhandler裡處理以便日後資料分析。

註冊 eventbus 相關服務以及 eventhandlers

services.addsingleton();

services.addsingleton();

//register eventhandlers

services.addsingleton();

訂閱事件

發布事件

eventbus.publish(new noticeviewevent );

自己動手實現乙個簡單的React

為了更好的理解react,我決定讀preact的原始碼,preact是乙個非常小的框架,同時也和react的實現原理以及api一樣,幾乎可以很好代替react。雖然還是有一些差異的。但是使用的時候幾乎不會有什麼違和感。看原始碼總是不夠過癮,於是做了乙個偉大的決定就是自己親手去寫乙個react,畢竟p...

動手實現乙個簡單神經網路

import numpy as np 定義乙個啟用函式 defsigmoid x,deriv false if deriv true return x 1 x return 1 1 np.exp x 構造樣本 x np.array 1,0,1,0,1,1 1,1,1,0,1,1 1,0,1,0,0,...

自己動手實現乙個簡單的string類 一

定義乙個基本的 string 類 class string private char base long int length 我們可以看到在這個類裡面我們用乙個char型指標來儲存字串值,long int 型值length來儲存字串的長度。由於我們知道string類支援這樣的建構函式 string...