70 lines
1.6 KiB
C#
70 lines
1.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace AibisDream.Framework
|
|
{
|
|
public class IocContainer
|
|
{
|
|
private readonly Dictionary<Type, object> _container = new();
|
|
|
|
public void Register<T>(T instance)
|
|
{
|
|
var key = typeof(T);
|
|
|
|
if (_container.ContainsKey(key))
|
|
{
|
|
_container[key] = instance;
|
|
}
|
|
else
|
|
{
|
|
_container.Add(key, instance);
|
|
}
|
|
}
|
|
|
|
public T Get<T>() where T : class
|
|
{
|
|
var key = typeof(T);
|
|
|
|
if (_container.TryGetValue(key, out var retInstance))
|
|
{
|
|
return retInstance as T;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public IEnumerable<T> GetInstancesByType<T>()
|
|
{
|
|
var type = typeof(T);
|
|
return _container.Values.Where(instance => type.IsInstanceOfType(instance)).Cast<T>();
|
|
}
|
|
|
|
public void Clear() => _container.Clear();
|
|
}
|
|
|
|
public static class IocTools
|
|
{
|
|
private static readonly IocContainer IocContainer = new();
|
|
|
|
public static void RegisterIoc<T>(this object self, T instance)
|
|
{
|
|
IocContainer.Register(instance);
|
|
}
|
|
|
|
public static T GetIoc<T>(this object self) where T : class
|
|
{
|
|
return IocContainer.Get<T>();
|
|
}
|
|
|
|
public static IEnumerable<T> GetIocInstancesByType<T>()
|
|
{
|
|
return IocContainer.GetInstancesByType<T>();
|
|
}
|
|
|
|
public static void ClearIoc()
|
|
{
|
|
IocContainer.Clear();
|
|
}
|
|
}
|
|
} |