CacheMaintenance.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using WingServerCommon.Log;
  3. using WingServerCommon.Interfaces.OpLog;
  4. namespace WingServerCommon.Interfaces.Cache
  5. {
  6. public class CacheMaintenance
  7. {
  8. private static CacheMaintenance _instance;
  9. private readonly Dictionary<Type, ICacheManager> _instances;
  10. public static CacheMaintenance Instance
  11. {
  12. get { return _instance ?? (_instance = new CacheMaintenance()); }
  13. }
  14. private CacheMaintenance()
  15. {
  16. _instances = new Dictionary<Type, ICacheManager>();
  17. Register(typeof(IDeviceInfosManager), new DeviceInfosManager());
  18. Register(typeof(IOrganizationsManager), new OrganizationsManager());
  19. Register(typeof(IDiagnosisModulesManager), new DiagnosisModulesManager());
  20. Register(typeof(IReportPostersManager), new ReportPostersManager());
  21. Register(typeof(IDistributedServerInfosManager), new DistributedServerInfosManager());
  22. Register(typeof(ITokensManager), new TokensManager());
  23. Register(typeof(IIPManager), new IPManager());
  24. Register(typeof(IConsultationRecordManager), new ConsultationRecordManager());
  25. Register(typeof(ICourseInfosManager), new CourseInfosManager());
  26. Register(typeof(IUserInfoManager), new UserInfoManager());
  27. Register(typeof(IGradingProtectionConfigManager), new GradingProtectionConfigManager());
  28. Register(typeof(IControllingParametersManager), new ControllingParametersManager());
  29. DatabaseCollection.CollectionDocumentChanged += OnCollectionDocumentChanged;
  30. }
  31. private void OnCollectionDocumentChanged(Object sender, CollectionDocumentChangedArgs args)
  32. {
  33. var typeName = $"I{args.CollectionName}Manager";
  34. //var type = Type.GetType(typeName);
  35. var type = _instances.FirstOrDefault(i => i.Key.Name == typeName).Key;
  36. if (type == null)
  37. {
  38. return;
  39. }
  40. ICacheManager manager;
  41. if (_instances.TryGetValue(type, out manager))
  42. {
  43. manager.RemoveMany(args);
  44. }
  45. }
  46. /// <summary>
  47. /// Register a cache manager to cache maintenance
  48. /// </summary>
  49. /// <param name="type"></param>
  50. /// <param name="manager"></param>
  51. private void Register(Type type, ICacheManager manager)
  52. {
  53. if (_instances.ContainsKey(typeof(Type)))
  54. {
  55. Logger.WriteLineWarn("Register duplicate type");
  56. }
  57. else
  58. {
  59. _instances.Add(type, manager);
  60. }
  61. }
  62. public T Get<T>()
  63. {
  64. ICacheManager manager;
  65. if (_instances.TryGetValue(typeof(T), out manager))
  66. {
  67. return (T)manager;
  68. }
  69. throw new Exception("Invalid type");
  70. }
  71. }
  72. }