委托的单例模式
在项目中我们经常会使用到委托,委托是多播的,如果控制不好反复注册就会多次触发,可以使用委托的单例模式去注册,这样可以避免多次触发问题。
下面是几种委托实例代码:
带参数委托管理:
/// <summary> /// 带参数的委托管理 /// </summary> public class ActionManager<T> { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> public static Dictionary<string, Action<T>> _actions = new Dictionary<string, Action<T>>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="action">委托</param> public static void Register(string name, Action<T> action) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> public static void Invoke(string name, T value) { // 执行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(value); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal(string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } }
调用方法:
ActionManager<参数>.Removal("注册Key");
ActionManager<参数>.Register("注册Key", 执行方法);
// 注册委托 ActionManager<string>.Removal("updateUser"); ActionManager<string>.Register("updateUser", str => { try { Console.WriteLine(str); } catch (Exception ex) { // 需使用logNet4 记录log日志,这样有助于发生异常后排查问题,委托中的异常不会抛出来。 throw; } }); // 执行委托 ActionManager<string>.Invoke("updateUser", "Hello World!");
不带参数委托管理:
/// <summary> /// 委托管理-不带参数 /// 用于解决ViewModel与ViewModel间的相互调用 /// </summary> public class ActionManager { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> public static Dictionary<string, Action> _actions = new Dictionary<string, Action>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="action">委托</param> public static void Register(string name, Action action) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> public static void Invoke(string name) { // 执行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal(string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } }
带参数与返回值的委托管理:
/// <summary> /// 委托管理-带参数与返回值委托管理 /// 用于解决ViewModel与ViewModel间的相互调用 /// </summary> public class FuncManager2<T> where T : class { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> static Dictionary<string, Func<T, bool>> _Funcs = new Dictionary<string, Func<T, bool>>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="func">委托</param> public static void Register(string name, Func<T, bool> func) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 if (!_Funcs.ContainsKey(name)) _Funcs.Add(name, func); } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> /// <param name="value">委托参数</param> /// <returns></returns> public static bool Invoke(string name, T value) { // 执行委托方法 if (_Funcs.ContainsKey(name)) return _Funcs[name].Invoke(value); return false; } }