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
}
}