using System;
using Unity;
using Unity.Lifetime;

namespace ModelTools.BusinessLogics
{
	/// <summary>
	/// Работа с UnityContainer
	/// </summary>
	public class UnityContainerConfigurator
	{
		private static IUnityContainer _unityContainer;

		public static IUnityContainer Container
		{
			get
			{
				if (_unityContainer == null) _unityContainer = new UnityContainer(); 
				return _unityContainer;
			}
		}

		/// <summary>
		/// Инициализация сервисов
		/// </summary>        
		public static void InitServices()
		{
			var ext = ServiceProviderLoader.GetImplementationExtensions();
			if (ext.Count == 0)
			{
				throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям");
			}
			// регистрируем в UnityContainaer зависимости
			foreach (var e in ext)
			{
				e.RegisterServices();
			}
		}

		/// <summary>
		/// Добавление зависимости
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <typeparam name="U"></typeparam>
		public static void PublishService<T, U>() where U : T => Container.RegisterType<T, U>(new HierarchicalLifetimeManager());

		/// <summary>
		/// Получение класса со всеми зависмостями
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <returns></returns>
		public static T Resolve<T>() => Container.Resolve<T>();
	}
}