(WPF)自己实现发布订阅管理类,彻底解耦发布者和订阅者

版权声明:转载请注明出处 https://blog.csdn.net/lcpskk/article/details/81582709

工作中一个项目用到微软的Microsoft.Practices.Prism.PubSubEvents.dll里的发布订阅工具类,实现viewmodel之间的通信,奈何项目升级的时候升级工具不支持这么长名字的dll,我们也知道dll文件的名字和dll程序集名是强关联的,文件名不能随意改变,否则编译可以通过,运行的时候是按程序集名+.dll后缀去寻找dll路径的,必然会导致无法找到引用文件错误。那么没办法只好自己实现这个工具类了,简单版工具类如下:

public class LDEventAggregator
    {
        public delegate void MsgAction(object msgTopic);
        private Dictionary<string, List<MsgAction>> actionDic = new Dictionary<string, List<MsgAction>>();
        public void Publish(object msgTopic)
        {
            if (actionDic.ContainsKey(msgTopic.GetType().Name))
            {
                foreach (var doAction in actionDic[msgTopic.GetType().Name])
                {
                    if (doAction != null)
                    {
                        doAction(msgTopic);
                    }
                }
            }
        }
        public void Subscribe<T>(MsgAction aAction)
        {
            string typeName = typeof(T).Name;
            if (string.IsNullOrEmpty(typeName))
                return;
            if (!actionDic.ContainsKey(typeName))
            {
                
                actionDic.Add(typeName, new List<MsgAction>() { aAction});
            }
            else
            {
                actionDic[typeName].Add(aAction);
            }
        }
    }

使用的时候,保证发布者和订阅者用同一个工具类去发布订阅就好了:

订阅者:this.EventAggregator.Subscribe<MyCustomEvent>(this.Dosomething);

发布者:this.EventAggregator.Publish(new MyCustomEvent());

猜你喜欢

转载自blog.csdn.net/lcpskk/article/details/81582709