剛做了一個EDA類庫,大家給看看
恩,本人對EDA類庫有幾個基本的需求:
1、支援POCO,訊息本身不能繼承父類,這樣利於序列化和遠端傳輸
2、不能使用字串作為訊息標識,這樣容易造成拼寫錯誤
3、訊息訂閱和釋出要儘量簡單,易於使用
1、支援POCO,訊息本身不能繼承父類,這樣利於序列化和遠端傳輸
2、不能使用字串作為訊息標識,這樣容易造成拼寫錯誤
3、訊息訂閱和釋出要儘量簡單,易於使用
// 在此輸入C程式碼 //訂閱訊息 CFMessage.Command.Subscribe((PasswordChanged d) => Debug.WriteLine(d.UserName)); //釋出訊息 CFMessage.Command.Publish(new PasswordChanged("zhangs", "123456", "654321")); <p class="indent"> |
// 在此輸入C程式碼 /// <summary> /// 訊息管理 /// </summary> public static class CFMessage { private static Dictionary<string, ICFMessagePublisher> endpoints = new Dictionary<string, ICFMessagePublisher>(); private static object endpointsLocker = new object(); /// <summary> /// 獲取事件通道的訊息管理器 /// </summary> /// <returns></returns> public static ICFMessagePublisher Event { get { return GetInstance("Event"); } } /// <summary> /// 獲取命令通道的訊息管理器 /// </summary> /// <returns></returns> public static ICFMessagePublisher Command { get { return GetInstance("Command"); } } /// <summary> /// 獲得指定通道的訊息管理器 /// </summary> /// <param name="endpoint">訊息通道</param> /// <returns></returns> public static ICFMessagePublisher GetInstance(string endpoint) { if (!endpoints.ContainsKey(endpoint)) { lock (endpointsLocker) { if (!endpoints.ContainsKey(endpoint)) endpoints.Add(endpoint, new CFMessagePublisher()); } } return endpoints[endpoint]; } } <p class="indent"> |
// 在此輸入C程式碼 /// <summary> /// 訊息釋出管理 /// </summary> internal class CFMessagePublisher : ICFMessagePublisher { private Dictionary<Type, List<CFMessageSubscriber>> subscribers = new Dictionary<Type, List<CFMessageSubscriber>>(); private object subscribersLocker = new object(); /// <summary> /// 訂閱同步訊息 /// </summary> /// <typeparam name="T">訊息型別</typeparam> /// <param name="domainEventSubscriber">訊息響應</param> public void Subscribe<T>(Action<T> domainEventSubscriber) { this.Subscribe(new CFMessageSubscriber { EventType = typeof(T), EventHandler = domainEventSubscriber, IsAsnyc = false, }); } /// <summary> /// 訂閱非同步訊息 /// </summary> /// <typeparam name="T">訊息型別</typeparam> /// <param name="domainEventSubscriber">訊息響應</param> public void SubscribeAsync<T>(Action<T> domainEventSubscriber) { this.Subscribe(new CFMessageSubscriber { EventType = typeof(T), EventHandler = domainEventSubscriber, IsAsnyc = true, }); } /// <summary> /// 訂閱訊息 /// </summary> /// <param name="domainEventSubscriber">訊息響應</param> private void Subscribe(CFMessageSubscriber domainEventSubscriber) { if (!this.subscribers.ContainsKey(domainEventSubscriber.EventType)) { lock (this.subscribersLocker) { if (!this.subscribers.ContainsKey(domainEventSubscriber.EventType)) this.subscribers.Add(domainEventSubscriber.EventType, new List<CFMessageSubscriber>()); } } this.subscribers[domainEventSubscriber.EventType].Add(domainEventSubscriber); } /// <summary> /// 釋出訊息 /// </summary> /// <typeparam name="T">訊息型別</typeparam> /// <param name="domainEvent">訊息體</param> public void Publish<T>(T domainEvent) { List<CFMessageSubscriber> subscriber = null; this.subscribers.TryGetValue(typeof(T), out subscriber); if (subscriber != null) { subscriber.ForEach(d => { Action<T> action = (Action<T>)d.EventHandler; if (d.IsAsnyc) action.BeginInvoke(domainEvent, ar => { try { action.EndInvoke(ar); } catch { } }, null); else action.Invoke(domainEvent); }); } } /// <summary> /// 重置訊息訂閱佇列 /// </summary> public void Reset() { this.subscribers.Clear(); } /// <summary> /// 重置指定型別的訊息訂閱佇列 /// </summary> /// <typeparam name="T">訊息型別</typeparam> public void Reset<T>() { Type type = typeof(T); if (this.subscribers.ContainsKey(type)) this.subscribers.Remove(type); } } <p class="indent"> |
// 在此輸入C程式碼 /// <summary> /// 訊息訂閱管理 /// </summary> public class CFMessageSubscriber { /// <summary> /// 訊息型別 /// </summary> public Type EventType { get; set; } /// <summary> /// 訊息響應 /// </summary> public Delegate EventHandler { get; set; } /// <summary> /// 是否非同步響應 /// </summary> public bool IsAsnyc { get; set; } } <p class="indent"> |
相關文章
- 做了個知乎專欄小程式版,分享給大家
- 做了一個給IceExt用的小程式(附原始碼)給大家,把RAW變成TXT,希望對大家有用。原始碼
- 我寫了一個從DATASOURCE取得CONNECTION的工具類,大家看看
- jdk 原始碼的一個BUG,大家來看看JDK原始碼
- 給大家分享一個案例分析-比較偏僻
- 給大家介紹一個不錯的資料庫處理程式包資料庫
- 我把我自己的日期類庫分享出來給大家用
- 我做了第一個ChatGPT .net api聊天庫ChatGPTAPI
- 給大家分享一個 python 做的搜尋引擎Python
- 自己最近搭建的一個docker映象站,分享給大家!Docker
- 大家幫幫忙,看看這個SQL怎麼寫!SQL
- 給大家介紹一個 B站 抖音 影片下載神器
- 課時36:類與物件:給大家介紹物件物件
- 大家看看這個東西怎麼解密啊!!!! (597字)解密
- 搞了一個很傻冒的軟體~~大家看看有錯沒? (4千字)
- 給大家分享幾個磁力播放器播放器
- 推薦給大家一個學習網路程式設計地方程式設計
- 面試題,大家也可以看看(piner)面試題
- 【貼圖】網友 snoopy 用《iHMI43 液晶模組》做的介面給大家看看OOP
- 我是剛接觸java的,請教大家一問題!Java
- 軟體測評題庫裡面的一題,答錯了,大家看看答案是否合理呢?
- 給你一個Demo 看看這時你要怎麼快速定位ANR?
- linux環境下phpize使用的一個小技巧分享給大家LinuxPHP
- 給大家推薦一個整合了python和bash的神器,xonshPython
- 給大家推薦一個軟體:視訊廣告過濾大師
- 很喜歡的一款開源類庫,可以幫你簡化每一行程式碼,推薦給大家行程
- 這個軟體真可惡!大家都來看看吧! (127字)
- 我的面試題,大家也可以看看面試題
- 對live555封裝的比較好的一個類,網上找到的,覺得不錯,給大家共享封裝
- 大家給個建議要買 Mac 還是 winMac
- 跳槽了,給大家整理一波面試題面試題
- 用java做了個QQ好友訊息群發器,拿出來跟大家分享和交流一下Java
- 開發了一年多的PHP編譯器BPC初見成效,發一些測試程式給大家看看PHP編譯
- 大家看看這個問題能否解決?關於無線應用
- 以前碰到的一道面試題,大家看看有哪些思路呢?面試題
- 福利來啦,送給大家一個小遊戲的原始碼,不要錯過喲遊戲原始碼
- 承諾兌現,完成一個許可權系統,並且開源給大家
- 給剛玩Hadoop的朋友一些建議Hadoop