2020-08-31

WPF 实现简易事件聚合

一直很心水棱镜(Prism)的事件聚合器。

看了下源代码,代码不多,但是东西真的不少。

简单的实现了一下,没有弱引用,没有线程安全,没有线程级别。

 

总的来说 原理还是很好理解的。

 

有点像观察者,或者说就是?

 

总共分为订阅,发布,通过一个单例总管。

内部设有一个字典和集合,保管引发实例和引发事件。

简单的画了个图

 

几处比较有意思的代码

字典保存对象

 public TArg GetEvent<TArg>() where TArg : EventBase, new()  {   if (!EventTypeName.TryGetValue(typeof(TArg), out EventBase eventBase))   {    var EventArgClass = new TArg();    if (EventArgClass != null)    {     EventTypeName[typeof(TArg)] = EventArgClass;    }    return EventArgClass;   }   else    return (TArg)eventBase;  }

 

引发事件

 public Action<object[]> DoAction()  {   if (this.Action != null)   {    return args =>    {     if (args != null && args[0] != null)     {      var d = default(TArg);      d = (TArg)args[0];      ((Action<TArg>)Action)(d);     }    };   }   return null;  }

 

 使用方式

 public class Test : MethodSetting {    } public class Test2 : MethodSetting<string> { } class Program {  static void Main(string[] args)  {   EventManager.Instance.GetEvent<Test>().SetMethod(GetTest);   EventManager.Instance.GetEvent<Test2>().SetMethod(GetTest2);   EventManager.Instance.GetEvent<Test>().Push();   EventManager.Instance.GetEvent<Test2>().Push("Test");   EventManager.Instance.GetEvent<Test>().RemoveMethod(new Action(GetTest));   EventManager.Instance.GetEvent<Test2>().RemoveMethod(new Action<string>(GetTest2));   EventManager.Instance.GetEvent<Test>().Push();   EventManager.Instance.GetEvent<Test2>().Push("Test");  }  private static void GetTest()  {  }  private static void GetTest2(string obj)  {  } }

 

 

 

代码下载

 

WPF 实现简易事件聚合超级大卖家现场深度干货分享淘粉8easy buy揭秘亚马逊A9算法中那些不为人知的细节_亚马逊A9算法优化技巧Anker耳机供应商营收超6亿 / Joom开放"网红营销"功能CostcoShopee 我的关键字广告 充值教程eBay全面解读:2019跨境出口爆品趋势!

No comments:

Post a Comment