using System;
namespace ZeroLevel.Patterns.DependencyInjection
{
    /// 
    /// Интерфейс с методами разрешений зависимостей
    /// 
    public interface IResolver
    {
        #region Activator
        /// 
        /// Создание экземпляра объекта указанного типа
        /// 
        /// Тип объекта
        /// Имя разрешения зависимости
        /// Экземпляр объекта
        T CreateInstance(string resolveName = "");
        /// 
        /// Создание экземпляра объекта указанного типа
        /// 
        /// Тип объекта
        /// Аргументы конструктора
        /// Имя разрешения зависимости
        /// Экземпляр объекта
        T CreateInstance(object[] args, string resolveName = "");
        /// 
        /// Создание экземпляра объекта указанного типа
        /// 
        /// Тип объекта
        /// Имя разрешения зависимости
        /// Экземпляр объекта
        object CreateInstance(Type type, string resolveName = "");
        /// 
        /// Создание экземпляра объекта указанного типа
        /// 
        /// Тип объекта
        /// Аргументы конструктора
        /// Имя разрешения зависимости
        /// Экземпляр объекта
        object CreateInstance(Type type, object[] args, string resolveName = "");
        #endregion
        #region Resolving
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Указание провести композицию при построении объектов
        /// Инстанс
        T Resolve(bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Имя разрешения зависимости
        /// Указание провести композицию при построении объектов
        /// Инстанс
        T Resolve(string resolveName, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Аргументы конструктора
        /// Указание провести композицию при построении объектов
        /// Инстанс
        T Resolve(object[] args, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Имя разрешения зависимости
        /// Аргументы конструктора
        /// Указание провести композицию при построении объектов
        /// Инстанс
        T Resolve(string resolveName, object[] args, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Указание провести композицию при построении объектов
        /// Инстанс
        object Resolve(Type type, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Имя разрешения зависимости
        /// Указание провести композицию при построении объектов
        /// Инстанс
        object Resolve(Type type, string resolveName, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Аргументы конструктора
        /// Указание провести композицию при построении объектов
        /// Инстанс
        object Resolve(Type type, object[] args, bool compose = true);
        /// 
        /// Разрешение зависимости
        /// 
        /// Тип контракта
        /// Имя разрешения зависимости
        /// Аргументы конструктора
        /// Указание провести композицию при построении объектов
        /// Инстанс
        object Resolve(Type type, string resolveName, object[] args, bool compose = true);
        #endregion
        #region Safe resolving
        object TryResolve(Type type, out object result, bool compose = true);
        object TryResolve(Type type, object[] args, out object result, bool compose = true);
        object TryResolve(Type type, string resolveName, out object result, bool compose = true);
        bool TryResolve(out T result, bool compose = true);
        bool TryResolve(object[] args, out T result, bool compose = true);
        bool TryResolve(string resolveName, out T result, bool compose = true);
        bool TryResolve(string resolveName, object[] args, out T result, bool compose = true);
        bool TryResolve(Type type, string resolveName, object[] args, out object result, bool compose = true);
        #endregion
    }
}