using Newtonsoft.Json.Linq; using Serein.Library.Api; using Serein.Library.Attributes; using Serein.Library.Web; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Xml; namespace Serein.Library.Utils { /// /// IOC管理容器 /// public class SereinIOC/* : ISereinIOC*/ { /// /// 类型集合,暂放待实例化的类型,完成实例化之后移除 /// private readonly ConcurrentDictionary _typeMappings; /// /// 已完成注入的实例集合 /// private readonly ConcurrentDictionary _dependencies; /// /// 未完成注入的实例集合。 /// 键:需要的类型名称 /// 值:元组(对象实例,对象的属性) /// private readonly ConcurrentDictionary> _unfinishedDependencies; public event IOCMembersChangedHandler OnIOCMembersChanged; public SereinIOC() { // 首先注册自己 _dependencies = new ConcurrentDictionary(); _typeMappings = new ConcurrentDictionary(); _unfinishedDependencies = new ConcurrentDictionary>(); } public void InitRegister() { //_dependencies[typeof(ISereinIOC).FullName] = this; Register(); //foreach (var type in _typeMappings.Values) //{ // Register(type); //} //Build(); } #region 类型的注册 /// /// 注册类型 /// /// 目标类型 /// 参数 public bool Register(Type type, params object[] parameters) { return RegisterType(type?.FullName, type); } /// /// 注册类型 /// /// 目标类型 /// 参数 public bool Register(params object[] parameters) { var type = typeof(T); return RegisterType(type.FullName, type); } /// /// 注册接口类型 /// /// 目标类型 /// 参数 public bool Register(params object[] parameters) where TImplementation : TService { return RegisterType(typeof(TService).FullName, typeof(TImplementation)); } #endregion /// /// 尝试从容器中获取对象,如果不存在目标类型的对象,则将类型信息登记到容器,并实例化注入依赖项。如果依然无法注册,则返回null。 /// public T GetOrRegisterInstantiate() { return (T)GetOrRegisterInstantiate(typeof(T)); } /// /// 尝试从容器中获取对象,如果不存在目标类型的对象,则将类型信息登记到容器,并实例化注入依赖项。如果依然无法注册,则返回null。 /// public object GetOrRegisterInstantiate(Type type) { // 尝试从容器中获取对象 if (!_dependencies.TryGetValue(type.FullName, out object value)) { // 容器中不存在目标类型的对象 if (type.IsInterface) { if (_typeMappings.TryGetValue(type.FullName, out Type implementationType)) { // 是接口类型,存在注册信息 Register(type);// 注册类型信息 value = Instantiate(implementationType); // 创建实例对象,并注入依赖 CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中 _typeMappings.TryRemove(type.FullName, out _); // 取消类型的注册信息 } else { //需要获取接口类型的实例,但不存在类型注册信息 Console.WriteLine("当前需要获取接口,但没有注册实现类的类型,无法创建接口实例"); return null; } } else { // 不是接口,直接注册 Register(type);// 注册类型信息 value = Instantiate(type); // 创建实例对象,并注入依赖 CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中 } } return value; } /// /// 用于临时实例的创建,不登记到IOC容器中,依赖项注入失败时也不记录。 /// /// /// /// public object Instantiate(Type controllerType, params object[] parameters) { var instance = Activator.CreateInstance(controllerType, parameters); // CreateInstance(controllerType, parameters); // 创建目标类型的实例 if (instance != null) { InjectDependencies(instance, false); // 完成创建后注入实例需要的依赖项 } return instance; } #region 通过名称记录或获取一个实例 /// /// 指定key值注册一个已经实例化的实例对象 /// /// /// /// public void CustomRegisterInstance(string key, object instance, bool needInjectProperty = true) { // 不存在时才允许创建 if (!_dependencies.ContainsKey(key)) { _dependencies.TryAdd(key, instance); } if (needInjectProperty) { InjectDependencies(instance); // 注入实例需要的依赖项 } InjectUnfinishedDependencies(key, instance); // 检查是否存在其它实例需要该类型 OnIOCMembersChanged?.Invoke(new IOCMembersChangedEventArgs(key, instance)); } public object Get(Type type) { return Get(type.FullName); } public T Get(string name) { return (T)Get(name); } private object Get(string name) { object value; if (!_dependencies.TryGetValue(name, out value)) { value = null; } return value; } #endregion #region 容器管理(清空,绑定) /// /// 清空容器对象 /// /// public bool Reset() { // 检查是否存在非托管资源 foreach (var instancei in _dependencies.Values) { if (typeof(IDisposable).IsAssignableFrom(instancei.GetType()) && instancei is IDisposable disposable) { disposable?.Dispose(); } } _unfinishedDependencies?.Clear(); _typeMappings?.Clear(); _dependencies?.Clear(); // _waitingForInstantiation?.Clear(); return true; } /// /// 实例化所有已注册的类型,并尝试绑定 /// /// public bool Build() { InitRegister(); // 遍历已注册类型 foreach (var type in _typeMappings.Values.ToArray()) { if (!_dependencies.ContainsKey(type.FullName)) { var value = CreateInstance(type); // 绑定时注册的类型如果没有创建实例,则创建对应的实例 CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中 } _typeMappings.TryRemove(type.FullName, out _); // 移除类型的注册记录 } foreach (var instance in _dependencies.Values) { InjectDependencies(instance); // 绑定时注入实例的依赖项 } return true; } #endregion #region 私有方法 /// /// 注册类型 /// /// /// private bool RegisterType(string typeFull, Type type) { if (!_typeMappings.ContainsKey(typeFull)) { _typeMappings[typeFull] = type; return true; } else { return false; } } /// /// 创建实例时,尝试注入到由ioc容器管理、并需要此实例的对象。 /// private object CreateInstance(Type type, params object[] parameters) { var instance = Activator.CreateInstance(type); InjectUnfinishedDependencies(type.FullName, instance); return instance; } private void InjectUnfinishedDependencies(string key,object instance) { if (_unfinishedDependencies.TryGetValue(key, out var unfinishedPropertyList)) { foreach ((object obj, PropertyInfo property) in unfinishedPropertyList) { property.SetValue(obj, instance); //注入依赖项 } if (_unfinishedDependencies.TryRemove(key, out unfinishedPropertyList)) { unfinishedPropertyList.Clear(); } } } /// /// 注入目标实例的依赖项 /// /// 实例 /// 未完成依赖项注入时是否记录 private bool InjectDependencies(object instance,bool isRecord = true) { var properties = instance.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public).ToArray() .Where(p => p.CanWrite // 可写属性 && p.GetCustomAttribute() != null // 有特性标注需要注入 && p.GetValue(instance) == null); // 属性为空 var isPass = true; foreach (var property in properties) { var propertyType = property.PropertyType; // 通过属性类型名称从ioc容器中获取对应的实例 if (_dependencies.TryGetValue(propertyType.FullName, out var dependencyInstance)) { property.SetValue(instance, dependencyInstance); // 尝试写入到目标实例的属性中 } else if(isRecord) { // 存在依赖项,但目标类型的实例暂未加载,需要等待需要实例完成注册 var unfinishedDependenciesList = _unfinishedDependencies.GetOrAdd(propertyType.FullName, _ = new List<(object, PropertyInfo)>()); var data = (instance, property); if (!unfinishedDependenciesList.Contains(data)) { unfinishedDependenciesList.Add(data); } isPass = false; } } return isPass; } /// /// 再次尝试注入目标实例的依赖项 /// //private void TryInstantiateWaitingDependencies() //{ // foreach (var waitingType in _waitingForInstantiation.ToList()) // { // if (_typeMappings.TryGetValue(waitingType.FullName, out var implementationType)) // { // var instance = Instantiate(implementationType); // if (instance != null) // { // _dependencies[waitingType.FullName] = instance; // _waitingForInstantiation.Remove(waitingType); // } // } // } //} #endregion #region run() //public bool Run(string name, Action action) //{ // var obj = Get(name); // if (obj != null) // { // if(obj is T service) // { // try // { // action(service); // } // catch (Exception ex) // { // Console.WriteLine(ex.Message); // } // } // } // return this; //} public void Run(Action action) { var service = GetOrRegisterInstantiate(); if (service != null) { action(service); } } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); action(service1, service2); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); action(service1, service2, service3); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); var service4 = GetOrRegisterInstantiate(); action(service1, service2, service3, service4); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); var service4 = GetOrRegisterInstantiate(); var service5 = GetOrRegisterInstantiate(); action(service1, service2, service3, service4, service5); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); var service4 = GetOrRegisterInstantiate(); var service5 = GetOrRegisterInstantiate(); var service6 = GetOrRegisterInstantiate(); action(service1, service2, service3, service4, service5, service6); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); var service4 = GetOrRegisterInstantiate(); var service5 = GetOrRegisterInstantiate(); var service6 = GetOrRegisterInstantiate(); var service7 = GetOrRegisterInstantiate(); action(service1, service2, service3, service4, service5, service6, service7); } public void Run(Action action) { var service1 = GetOrRegisterInstantiate(); var service2 = GetOrRegisterInstantiate(); var service3 = GetOrRegisterInstantiate(); var service4 = GetOrRegisterInstantiate(); var service5 = GetOrRegisterInstantiate(); var service6 = GetOrRegisterInstantiate(); var service7 = GetOrRegisterInstantiate(); var service8 = GetOrRegisterInstantiate(); action(service1, service2, service3, service4, service5, service6, service7, service8); } #endregion } /* public interface IServiceContainer { ServiceContainer Register(params object[] parameters); ServiceContainer Register(params object[] parameters) where TImplementation : TService; TService Resolve(); void Get(Action action); object Instantiate(Type type, params object[] parameters); } public class ServiceContainer : IServiceContainer { private readonly Dictionary _dependencies; public ServiceContainer() { _dependencies = new Dictionary { [typeof(IServiceContainer)] = this }; } public void Get(Action action) { var service = Resolve(); action(service); } public ServiceContainer Register(params object[] parameters) { var instance = Instantiate(typeof(T), parameters); _dependencies[typeof(T)] = instance; return this; } public ServiceContainer Register(params object[] parameters) where TImplementation : TService { _dependencies[typeof(TService)] = Instantiate(typeof(TImplementation), parameters); return this; } public TService Resolve() { return (TService)_dependencies[typeof(TService)]; } public object Instantiate(Type controllerType, params object[] parameters) { var constructors = controllerType.GetConstructors(); // 获取控制器的所有构造函数 // 查找具有最多参数的构造函数 var constructor = constructors.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault(); if (constructor != null) { if (parameters.Length > 0) { return Activator.CreateInstance(controllerType, parameters); } else { var tmpParameters = constructor.GetParameters(); var dependencyInstances = new List(); foreach (var parameter in tmpParameters) { var parameterType = parameter.ParameterType; _dependencies.TryGetValue(parameterType, out var dependencyInstance); dependencyInstances.Add(dependencyInstance); if (dependencyInstance == null) { return null; } } // 用解析的依赖项实例化目标类型 return Activator.CreateInstance(controllerType, dependencyInstances.ToArray()); } } else { return Activator.CreateInstance(controllerType); } } }*/ }