61 lines
1.7 KiB
C#
61 lines
1.7 KiB
C#
|
|
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<T>(this IServiceProvider provider) where T : class
|
|||
|
|
{
|
|||
|
|
return provider.GetService(typeof(T)) as T;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void AddService<T>(this IServiceContainer container, T serviceInstance)
|
|||
|
|
{
|
|||
|
|
if (container == null) throw new ArgumentNullException(nameof(container));
|
|||
|
|
|
|||
|
|
container.AddService(typeof(T), serviceInstance);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void RemoveService<T>(this IServiceContainer container)
|
|||
|
|
{
|
|||
|
|
if (container == null) throw new ArgumentNullException(nameof(container));
|
|||
|
|
|
|||
|
|
container.RemoveService(typeof(T));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal class ServiceContainer : IServiceContainer
|
|||
|
|
{
|
|||
|
|
private readonly Dictionary<Type, object> _services = new Dictionary<Type, object>();
|
|||
|
|
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|