using System; using System.Collections.Generic; using System.Data; using System.Linq; using Vinno.FIS.Sonopost.Managers.Interfaces; using Vinno.IUS.Common.Log; namespace Vinno.FIS.Sonopost.Managers { internal class AppManager { private static bool _initialized; private static AppManager _instance; private readonly Dictionary _managers = new Dictionary(); public static AppManager Instance => _instance ?? (_instance = new AppManager()); /// /// Load language resource files /// public void RegisterManager(T instance) where T : ISonopostManager { var type = typeof(T); if (_managers.ContainsKey(type)) { throw new DuplicateNameException($"Type {type.Name} already exists."); } _managers[type] = instance; Logger.WriteLineInfo($"AppManager Manager {type.Name} registerd"); } /// /// Unregister a manager from app manager /// private void UnRegisterManager() where T : ISonopostManager { var type = typeof(T); if (!_managers.ContainsKey(type)) { throw new DuplicateNameException($"Type {type} does not exists."); } _managers[type].Dispose(); _managers.Remove(type); } /// /// dispose all managers /// public void DisposeAllManagers() { foreach (var manager in _managers.Reverse()) { try { Logger.WriteLineInfo($"Disposing - {manager.Key?.Name}"); manager.Value.Dispose(); Logger.WriteLineInfo($"Disposed - {manager.Key?.Name}"); } catch (Exception e) { Logger.WriteLineError($"Dispose Manager {manager.Key} failed, ex: {e}"); } } Logger.WriteLineInfo($"AppManager DisposeAllManagers success"); } /// /// Get Manager by specified type /// /// /// public T GetManager() where T : ISonopostManager { var type = typeof(T); if (_managers.ContainsKey(type)) { return (T)_managers[type]; } throw new NullReferenceException($"Can not find instance for type{type}"); } public ISonopostManager GetManager(Type type) { if (_managers.ContainsKey(type)) { return _managers[type]; } throw new NullReferenceException($"Can not find instance for type{type}"); } /// /// init all managers /// public void Initialize() { if (_initialized) { Logger.WriteLineInfo("Has been Initialized"); return; } RegisterManager(new ConfigManager());//must first RegisterManager(new KeyBoardListenManager()); RegisterManager(new FISManager()); RegisterManager(new LoginManager()); RegisterManager(new RemedicalManager()); RegisterManager(new AfterSalesManager()); RegisterManager(new DicomServerManager()); RegisterManager(new LiveVideoManager()); RegisterManager(new OledManager()); RegisterManager(new DeviceManager()); RegisterManager(new NetworkManager()); RegisterManager(new TestManager()); RegisterManager(new VersionCheckManager()); RegisterManager(new ExternalMemoryManager()); Logger.WriteLineInfo("AppManager RegisterPluginCreators Register end"); _initialized = true; } } }