DisposerEventManager.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Base;
  6. namespace Model
  7. {
  8. public interface IDisposerEvent
  9. {
  10. Type ValueType();
  11. void SetValue(object value);
  12. }
  13. public abstract class DisposerEvent<T> : IDisposerEvent
  14. {
  15. private T value;
  16. protected T GetValue()
  17. {
  18. return value;
  19. }
  20. public void SetValue(object v)
  21. {
  22. this.value = (T)v;
  23. }
  24. public Type ValueType()
  25. {
  26. return typeof(T);
  27. }
  28. }
  29. public sealed class DisposerEventManager
  30. {
  31. private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
  32. private Dictionary<Type, IDisposerEvent> disposerEvents;
  33. private readonly HashSet<Disposer> updates = new HashSet<Disposer>();
  34. private readonly HashSet<Disposer> loaders = new HashSet<Disposer>();
  35. public void Register(string name, Assembly assembly)
  36. {
  37. this.assemblies[name] = assembly;
  38. this.disposerEvents = new Dictionary<Type, IDisposerEvent>();
  39. foreach (Assembly ass in this.assemblies.Values)
  40. {
  41. Type[] types = ass.GetTypes();
  42. foreach (Type type in types)
  43. {
  44. object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), false);
  45. if (attrs.Length == 0)
  46. {
  47. continue;
  48. }
  49. object obj = Activator.CreateInstance(type);
  50. IDisposerEvent disposerEvent = obj as IDisposerEvent;
  51. if (disposerEvent == null)
  52. {
  53. Log.Error($"组件事件没有继承IComponentEvent: {type.Name}");
  54. }
  55. this.disposerEvents[disposerEvent.ValueType()] = disposerEvent;
  56. }
  57. }
  58. this.Load();
  59. }
  60. public Assembly GetAssembly(string name)
  61. {
  62. return this.assemblies[name];
  63. }
  64. public Assembly[] GetAssemblies()
  65. {
  66. return this.assemblies.Values.ToArray();
  67. }
  68. private void Load()
  69. {
  70. foreach (Disposer disposer in this.loaders)
  71. {
  72. IDisposerEvent disposerEvent;
  73. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  74. {
  75. continue;
  76. }
  77. ILoader iLoader = disposerEvent as ILoader;
  78. if (iLoader == null)
  79. {
  80. continue;
  81. }
  82. disposerEvent.SetValue(disposer);
  83. iLoader.Load();
  84. }
  85. }
  86. public void Add(Disposer disposer)
  87. {
  88. if (this.disposerEvents == null)
  89. {
  90. return;
  91. }
  92. IDisposerEvent disposerEvent;
  93. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  94. {
  95. return;
  96. }
  97. IUpdate iUpdate = disposerEvent as IUpdate;
  98. if (iUpdate != null)
  99. {
  100. this.updates.Add(disposer);
  101. }
  102. ILoader iLoader = disposerEvent as ILoader;
  103. if (iLoader != null)
  104. {
  105. this.loaders.Add(disposer);
  106. }
  107. }
  108. public void Remove(Disposer disposer)
  109. {
  110. IDisposerEvent disposerEvent;
  111. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  112. {
  113. return;
  114. }
  115. IUpdate iUpdate = disposerEvent as IUpdate;
  116. if (iUpdate != null)
  117. {
  118. this.updates.Remove(disposer);
  119. }
  120. ILoader iLoader = disposerEvent as ILoader;
  121. if (iLoader != null)
  122. {
  123. this.loaders.Remove(disposer);
  124. }
  125. }
  126. public void Awake(Disposer disposer)
  127. {
  128. IDisposerEvent disposerEvent;
  129. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  130. {
  131. return;
  132. }
  133. IAwake iAwake = disposerEvent as IAwake;
  134. if (iAwake == null)
  135. {
  136. return;
  137. }
  138. disposerEvent.SetValue(disposer);
  139. iAwake.Awake();
  140. }
  141. public void Awake<P1>(Disposer disposer, P1 p1)
  142. {
  143. IDisposerEvent disposerEvent;
  144. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  145. {
  146. return;
  147. }
  148. IAwake<P1> iAwake = disposerEvent as IAwake<P1>;
  149. if (iAwake == null)
  150. {
  151. return;
  152. }
  153. disposerEvent.SetValue(disposer);
  154. iAwake.Awake(p1);
  155. }
  156. public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
  157. {
  158. IDisposerEvent disposerEvent;
  159. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  160. {
  161. return;
  162. }
  163. IAwake<P1, P2> iAwake = disposerEvent as IAwake<P1, P2>;
  164. if (iAwake == null)
  165. {
  166. return;
  167. }
  168. disposerEvent.SetValue(disposer);
  169. iAwake.Awake(p1, p2);
  170. }
  171. public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
  172. {
  173. IDisposerEvent disposerEvent;
  174. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  175. {
  176. return;
  177. }
  178. IAwake<P1, P2, P3> iAwake = disposerEvent as IAwake<P1, P2, P3>;
  179. if (iAwake == null)
  180. {
  181. return;
  182. }
  183. disposerEvent.SetValue(disposer);
  184. iAwake.Awake(p1, p2, p3);
  185. }
  186. public void Update()
  187. {
  188. foreach (Disposer disposer in updates)
  189. {
  190. IDisposerEvent disposerEvent;
  191. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  192. {
  193. continue;
  194. }
  195. IUpdate iUpdate = disposerEvent as IUpdate;
  196. if (iUpdate == null)
  197. {
  198. continue;
  199. }
  200. disposerEvent.SetValue(disposer);
  201. try
  202. {
  203. iUpdate.Update();
  204. }
  205. catch (Exception e)
  206. {
  207. Log.Error(e.ToString());
  208. }
  209. }
  210. }
  211. }
  212. }