| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | 
							- using System;
 
- using System.Collections.Concurrent;
 
- using System.Collections.Generic;
 
- using System.Reflection;
 
- namespace OpenSEMI.Core.Container
 
- {
 
- 	public class w : IContainer, IServiceProvider
 
- 	{
 
- 		private readonly ConcurrentDictionary<Type, CachedTypeInfo> _serviceTypeLookup = new ConcurrentDictionary<Type, CachedTypeInfo>();
 
- 		private readonly ConcurrentDictionary<Type, object> _serviceInstanceLookup = new ConcurrentDictionary<Type, object>();
 
- 		private readonly ConcurrentDictionary<Type, Action<object>> _serviceTypeCallbackLookup = new ConcurrentDictionary<Type, Action<object>>();
 
- 		public void Register<TService, TImplementation>() where TImplementation : TService
 
- 		{
 
- 			_serviceTypeLookup[typeof(TService)] = new CachedTypeInfo
 
- 			{
 
- 				Type = typeof(TImplementation),
 
- 				IsSingleton = true
 
- 			};
 
- 		}
 
- 		public void Register<TService, TImplementation>(bool singleton = true) where TImplementation : TService
 
- 		{
 
- 			_serviceTypeLookup[typeof(TService)] = new CachedTypeInfo
 
- 			{
 
- 				Type = typeof(TImplementation),
 
- 				IsSingleton = singleton
 
- 			};
 
- 		}
 
- 		public void Register<TService>(Type implementationType, bool singleton = true)
 
- 		{
 
- 			if (implementationType == (Type)null)
 
- 			{
 
- 				throw new ArgumentNullException("implementationType cannot be null.");
 
- 			}
 
- 			_serviceTypeLookup[typeof(TService)] = new CachedTypeInfo
 
- 			{
 
- 				Type = implementationType,
 
- 				IsSingleton = singleton
 
- 			};
 
- 		}
 
- 		public void Register<TService>(Type implementationType, Action<TService> callback, bool singleton = true)
 
- 		{
 
- 			if (implementationType == (Type)null)
 
- 			{
 
- 				throw new ArgumentNullException("serviceType cannot be null.");
 
- 			}
 
- 			_serviceTypeLookup[typeof(TService)] = new CachedTypeInfo
 
- 			{
 
- 				Type = implementationType,
 
- 				IsSingleton = singleton
 
- 			};
 
- 			if (callback != null)
 
- 			{
 
- 				_serviceTypeCallbackLookup[typeof(TService)] = delegate(object x)
 
- 				{
 
- 					callback((TService)x);
 
- 				};
 
- 			}
 
- 		}
 
- 		public void Register(Type serviceType, Type implementationType, bool singleton = true)
 
- 		{
 
- 			if (serviceType == (Type)null)
 
- 			{
 
- 				throw new ArgumentNullException("serviceType cannot be null.");
 
- 			}
 
- 			if (implementationType == (Type)null)
 
- 			{
 
- 				throw new ArgumentNullException("serviceType cannot be null.");
 
- 			}
 
- 			if (!serviceType.IsAssignableFrom(implementationType))
 
- 			{
 
- 				throw new ArgumentException($"Service could not be registered. {implementationType.Name} does not implement {serviceType.Name}.");
 
- 			}
 
- 			_serviceTypeLookup[serviceType] = new CachedTypeInfo
 
- 			{
 
- 				Type = implementationType,
 
- 				IsSingleton = singleton
 
- 			};
 
- 		}
 
- 		public void Register<TService>(TService instance)
 
- 		{
 
- 			if (instance == null)
 
- 			{
 
- 				throw new ArgumentNullException("instance cannot be null.");
 
- 			}
 
- 			_serviceInstanceLookup[typeof(TService)] = instance;
 
- 		}
 
- 		public T Resolve<T>()
 
- 		{
 
- 			return (T)Resolve(typeof(T));
 
- 		}
 
- 		private object Resolve(Type type)
 
- 		{
 
- 			object value = null;
 
- 			if (!_serviceTypeLookup.TryGetValue(type, out CachedTypeInfo value2))
 
- 			{
 
- 				Register(type, type, true);
 
- 				CachedTypeInfo cachedTypeInfo = default(CachedTypeInfo);
 
- 				cachedTypeInfo.Type = type;
 
- 				cachedTypeInfo.IsSingleton = true;
 
- 				value2 = cachedTypeInfo;
 
- 			}
 
- 			if (_serviceInstanceLookup.TryGetValue(type, out value))
 
- 			{
 
- 				return value;
 
- 			}
 
- 			ConstructorInfo constructor = ConstructorCache.GetConstructor(value2.Type);
 
- 			if (constructor != (ConstructorInfo)null)
 
- 			{
 
- 				List<ParameterInfo> parameters = ParameterCache.GetParameters(constructor);
 
- 				List<object> list = new List<object>();
 
- 				foreach (ParameterInfo item in parameters)
 
- 				{
 
- 					list.Add(Resolve(item.ParameterType));
 
- 				}
 
- 				object obj = Activator.CreateInstance(value2.Type, list.ToArray());
 
- 				if (_serviceTypeCallbackLookup.TryGetValue(type, out Action<object> value3))
 
- 				{
 
- 					value3(obj);
 
- 				}
 
- 				if (value2.IsSingleton)
 
- 				{
 
- 					_serviceInstanceLookup[type] = obj;
 
- 				}
 
- 				return obj;
 
- 			}
 
- 			return null;
 
- 		}
 
- 		public bool IsRegistered<TService>()
 
- 		{
 
- 			if (_serviceTypeLookup.ContainsKey(typeof(TService)) || _serviceInstanceLookup.ContainsKey(typeof(TService)))
 
- 			{
 
- 				return true;
 
- 			}
 
- 			return false;
 
- 		}
 
- 		public object GetService(Type serviceType)
 
- 		{
 
- 			return Resolve(serviceType);
 
- 		}
 
- 	}
 
- }
 
 
  |