DisposerManager.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. using Base;
  7. namespace Model
  8. {
  9. public interface IDisposerEvent
  10. {
  11. Type ValueType();
  12. void SetValue(object value);
  13. }
  14. public abstract class DisposerEvent<T> : IDisposerEvent
  15. {
  16. private T value;
  17. protected T GetValue()
  18. {
  19. return value;
  20. }
  21. public void SetValue(object v)
  22. {
  23. this.value = (T)v;
  24. }
  25. public Type ValueType()
  26. {
  27. return typeof(T);
  28. }
  29. }
  30. public sealed class DisposerManager : IDisposable
  31. {
  32. private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
  33. private Dictionary<Type, IDisposerEvent> disposerEvents;
  34. private readonly HashSet<Disposer> disposers = new HashSet<Disposer>();
  35. private readonly HashSet<Disposer> updates = new HashSet<Disposer>();
  36. private readonly HashSet<Disposer> loaders = new HashSet<Disposer>();
  37. private static DisposerManager instance = new DisposerManager();
  38. public static DisposerManager Instance
  39. {
  40. get
  41. {
  42. return instance;
  43. }
  44. }
  45. private DisposerManager()
  46. {
  47. }
  48. public static void Reset()
  49. {
  50. instance.Dispose();
  51. instance = new DisposerManager();
  52. }
  53. public void Dispose()
  54. {
  55. foreach (Disposer o in this.disposers.ToArray())
  56. {
  57. o.Dispose();
  58. }
  59. }
  60. public void Register(string name, Assembly assembly)
  61. {
  62. this.assemblies[name] = assembly;
  63. this.disposerEvents = new Dictionary<Type, IDisposerEvent>();
  64. foreach (Assembly ass in this.assemblies.Values)
  65. {
  66. Type[] types = ass.GetTypes();
  67. foreach (Type type in types)
  68. {
  69. object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), false);
  70. if (attrs.Length == 0)
  71. {
  72. continue;
  73. }
  74. object obj = Activator.CreateInstance(type);
  75. IDisposerEvent disposerEvent = obj as IDisposerEvent;
  76. if (disposerEvent == null)
  77. {
  78. Log.Error($"组件事件没有继承IComponentEvent: {type.Name}");
  79. }
  80. this.disposerEvents[disposerEvent.ValueType()] = disposerEvent;
  81. }
  82. }
  83. this.Load();
  84. }
  85. public Assembly GetAssembly(string name)
  86. {
  87. return this.assemblies[name];
  88. }
  89. public Assembly[] GetAssemblies()
  90. {
  91. return this.assemblies.Values.ToArray();
  92. }
  93. private void Load()
  94. {
  95. foreach (Disposer disposer in this.loaders)
  96. {
  97. IDisposerEvent disposerEvent;
  98. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  99. {
  100. continue;
  101. }
  102. ILoader iLoader = disposerEvent as ILoader;
  103. if (iLoader == null)
  104. {
  105. continue;
  106. }
  107. disposerEvent.SetValue(disposer);
  108. iLoader.Load();
  109. }
  110. }
  111. public void Add(Disposer disposer)
  112. {
  113. if (this.disposerEvents == null)
  114. {
  115. return;
  116. }
  117. this.disposers.Add(disposer);
  118. IDisposerEvent disposerEvent;
  119. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  120. {
  121. return;
  122. }
  123. IUpdate iUpdate = disposerEvent as IUpdate;
  124. if (iUpdate != null)
  125. {
  126. this.updates.Add(disposer);
  127. }
  128. ILoader iLoader = disposerEvent as ILoader;
  129. if (iLoader != null)
  130. {
  131. this.loaders.Add(disposer);
  132. }
  133. }
  134. public void Remove(Disposer disposer)
  135. {
  136. this.disposers.Remove(disposer);
  137. IDisposerEvent disposerEvent;
  138. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  139. {
  140. return;
  141. }
  142. IUpdate iUpdate = disposerEvent as IUpdate;
  143. if (iUpdate != null)
  144. {
  145. this.updates.Remove(disposer);
  146. }
  147. ILoader iLoader = disposerEvent as ILoader;
  148. if (iLoader != null)
  149. {
  150. this.loaders.Remove(disposer);
  151. }
  152. }
  153. public void Awake(Disposer disposer)
  154. {
  155. IDisposerEvent disposerEvent;
  156. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  157. {
  158. return;
  159. }
  160. IAwake iAwake = disposerEvent as IAwake;
  161. if (iAwake == null)
  162. {
  163. return;
  164. }
  165. disposerEvent.SetValue(disposer);
  166. iAwake.Awake();
  167. }
  168. public void Awake<P1>(Disposer disposer, P1 p1)
  169. {
  170. IDisposerEvent disposerEvent;
  171. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  172. {
  173. return;
  174. }
  175. IAwake<P1> iAwake = disposerEvent as IAwake<P1>;
  176. if (iAwake == null)
  177. {
  178. return;
  179. }
  180. disposerEvent.SetValue(disposer);
  181. iAwake.Awake(p1);
  182. }
  183. public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
  184. {
  185. IDisposerEvent disposerEvent;
  186. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  187. {
  188. return;
  189. }
  190. IAwake<P1, P2> iAwake = disposerEvent as IAwake<P1, P2>;
  191. if (iAwake == null)
  192. {
  193. return;
  194. }
  195. disposerEvent.SetValue(disposer);
  196. iAwake.Awake(p1, p2);
  197. }
  198. public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
  199. {
  200. IDisposerEvent disposerEvent;
  201. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  202. {
  203. return;
  204. }
  205. IAwake<P1, P2, P3> iAwake = disposerEvent as IAwake<P1, P2, P3>;
  206. if (iAwake == null)
  207. {
  208. return;
  209. }
  210. disposerEvent.SetValue(disposer);
  211. iAwake.Awake(p1, p2, p3);
  212. }
  213. public void Update()
  214. {
  215. foreach (Disposer disposer in updates)
  216. {
  217. IDisposerEvent disposerEvent;
  218. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
  219. {
  220. continue;
  221. }
  222. IUpdate iUpdate = disposerEvent as IUpdate;
  223. if (iUpdate == null)
  224. {
  225. continue;
  226. }
  227. disposerEvent.SetValue(disposer);
  228. try
  229. {
  230. iUpdate.Update();
  231. }
  232. catch (Exception e)
  233. {
  234. Log.Error(e.ToString());
  235. }
  236. }
  237. }
  238. public override string ToString()
  239. {
  240. var info = new Dictionary<string, int>();
  241. foreach (Disposer obj in this.disposers)
  242. {
  243. if (info.ContainsKey(obj.GetType().Name))
  244. {
  245. info[obj.GetType().Name] += 1;
  246. }
  247. else
  248. {
  249. info[obj.GetType().Name] = 1;
  250. }
  251. }
  252. info = info.OrderByDescending(s => s.Value).ToDictionary(p => p.Key, p => p.Value);
  253. StringBuilder sb = new StringBuilder();
  254. sb.Append("\r\n");
  255. foreach (string key in info.Keys)
  256. {
  257. sb.Append($"{info[key],10} {key}\r\n");
  258. }
  259. sb.Append($"\r\n update: {this.updates.Count} total: {this.disposers.Count}");
  260. return sb.ToString();
  261. }
  262. }
  263. }