GlobalSettingsStore.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using InABox.Configuration;
  2. using InABox.Core;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace InABox.Database.Stores;
  9. public class GlobalSettingsStore : Store<GlobalSettings>
  10. {
  11. private static Dictionary<string, Tuple<Type, Type>> _subStores = new();
  12. public static void RegisterSubStore<TSettings, TStore>()
  13. where TSettings : BaseObject, IGlobalConfigurationSettings, new()
  14. where TStore : ISettingsStoreEventHandler<TSettings>
  15. {
  16. _subStores[typeof(TSettings).Name] = new(typeof(TSettings), typeof(TStore));
  17. }
  18. private BaseObject GetSettings(GlobalSettings settings, Type TSettings)
  19. {
  20. var result = Serialization.Deserialize(TSettings, settings.Contents) as BaseObject;
  21. if(result is not null)
  22. {
  23. result.CommitChanges();
  24. }
  25. else
  26. {
  27. result = (Activator.CreateInstance(TSettings) as BaseObject)!;
  28. }
  29. return result;
  30. }
  31. protected override void BeforeSave(GlobalSettings entity)
  32. {
  33. base.BeforeSave(entity);
  34. if(_subStores.TryGetValue(entity.Section, out var subStore))
  35. {
  36. (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeSave(GetSettings(entity, subStore.Item1));
  37. }
  38. }
  39. protected override void AfterSave(GlobalSettings entity)
  40. {
  41. base.AfterSave(entity);
  42. if(_subStores.TryGetValue(entity.Section, out var subStore))
  43. {
  44. (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterSave(GetSettings(entity, subStore.Item1));
  45. }
  46. }
  47. protected override void BeforeDelete(GlobalSettings entity)
  48. {
  49. base.BeforeDelete(entity);
  50. if(_subStores.TryGetValue(entity.Section, out var subStore))
  51. {
  52. (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeDelete(GetSettings(entity, subStore.Item1));
  53. }
  54. }
  55. protected override void AfterDelete(GlobalSettings entity)
  56. {
  57. base.AfterDelete(entity);
  58. if(_subStores.TryGetValue(entity.Section, out var subStore))
  59. {
  60. (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterDelete(GetSettings(entity, subStore.Item1));
  61. }
  62. }
  63. }
  64. public interface ISettingsStoreEventHandler
  65. {
  66. void BeforeSave(BaseObject entity);
  67. void AfterSave(BaseObject entity);
  68. void BeforeDelete(BaseObject entity);
  69. void AfterDelete(BaseObject entity);
  70. }
  71. public interface ISettingsStoreEventHandler<T> : ISettingsStoreEventHandler
  72. where T : BaseObject
  73. {
  74. void BeforeSave(T entity);
  75. void AfterSave(T entity);
  76. void BeforeDelete(T entity);
  77. void AfterDelete(T entity);
  78. void ISettingsStoreEventHandler.BeforeSave(BaseObject entity) => BeforeSave((T)entity);
  79. void ISettingsStoreEventHandler.AfterSave(BaseObject entity) => AfterSave((T)entity);
  80. void ISettingsStoreEventHandler.BeforeDelete(BaseObject entity) => BeforeDelete((T)entity);
  81. void ISettingsStoreEventHandler.AfterDelete(BaseObject entity) => AfterDelete((T)entity);
  82. }