using Bit.Core.Abstractions; using Bit.Core.Services; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Bit.Core.Utilities { public static class ServiceContainer { public static Dictionary RegisteredServices { get; set; } = new Dictionary(); public static bool Inited { get; set; } public static void Init() { if(Inited) { return; } Inited = true; var platformUtilsService = Resolve("platformUtilsService"); var storageService = Resolve("storageService"); var secureStorageService = Resolve("secureStorageService"); var cryptoPrimitiveService = Resolve("cryptoPrimitiveService"); var stateService = new StateService(); var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService); var cryptoService = new CryptoService(storageService, secureStorageService, cryptoFunctionService); var tokenService = new TokenService(storageService); var apiService = new ApiService(tokenService, platformUtilsService, (bool expired) => Task.FromResult(0)); var appIdService = new AppIdService(storageService); var userService = new UserService(storageService, tokenService); Register("stateService", stateService); Register("cryptoFunctionService", cryptoFunctionService); Register("cryptoService", cryptoService); Register("tokenService", tokenService); Register("apiService", apiService); // TODO: interface Register("appIdService", appIdService); Register("userService", userService); } public static void Register(string serviceName, T obj) { if(RegisteredServices.ContainsKey(serviceName)) { throw new Exception($"Service {serviceName} has already been registered."); } RegisteredServices.Add(serviceName, obj); } public static T Resolve(string serviceName, bool dontThrow = false) { if(RegisteredServices.ContainsKey(serviceName)) { return (T)RegisteredServices[serviceName]; } if(dontThrow) { return (T)(object)null; } throw new Exception($"Service {serviceName} is not registered."); } } }