using System; using System.Collections.Generic; namespace Unity.CodeEditor.Utils { internal interface IServiceContainer : IServiceProvider { void AddService(Type serviceType, object serviceInstance); void RemoveService(Type serviceType); } internal static class ServiceExtensions { internal static T GetService(this IServiceProvider provider) where T : class { return provider.GetService(typeof(T)) as T; } public static void AddService(this IServiceContainer container, T serviceInstance) { if (container == null) throw new ArgumentNullException(nameof(container)); container.AddService(typeof(T), serviceInstance); } public static void RemoveService(this IServiceContainer container) { if (container == null) throw new ArgumentNullException(nameof(container)); container.RemoveService(typeof(T)); } } internal class ServiceContainer : IServiceContainer { private readonly Dictionary _services = new Dictionary(); internal ServiceContainer() { _services.Add(typeof(IServiceProvider), this); _services.Add(typeof(IServiceContainer), this); } public object GetService(Type serviceType) { _services.TryGetValue(serviceType, out var service); return service; } public void AddService(Type serviceType, object serviceInstance) { _services[serviceType] = serviceInstance; } public void RemoveService(Type serviceType) { _services.Remove(serviceType); } } }