/// <summary> /// Создать экземпляр типа <see cref="WidestConstructorInstanceBuilder.type"/>. /// Используя "широчайший" из конструкторов с разрешимыми контейнером параметрами. /// </summary> /// <param name="container">Контейнер, в котором создаётся экземпляр</param> /// <returns>Экземпляр класса, с внедрёнными в него зависимостями</returns> public object BuildInstance(IContainer container) { // Ищем подходящий конструктор var constructor = type.GetPublicConstructors() .Where(c => CheckConstructorTypes(c, container)) .ToArray() .OrderBy(GetConstructorWeight) .ToArray() .LastOrDefault(); // И если он найден if (constructor != null) { // Вызываем его, внедряя зависимости var parameters = InstanceCreationHelper.GetMethodDependencies(constructor, container); try { return(constructor.Invoke(parameters)); } catch (TargetInvocationException e) { throw e.InnerException ?? e; } } throw new ArgumentException($"No suitable constructor found in {type.Name} class"); }
/// <summary> /// Создать экземпляр класса, используя конструктор по-умолчанию /// и внедрение зависимостей через его свойства и сеттеры. /// </summary> /// <param name="container"></param> /// <returns></returns> /// <exception cref="ArgumentException"/> public object BuildInstance(IContainer container) { try { // Создаём экземпляр var obj = constructor.Invoke(Type.EmptyTypes); // И пытаемся установить отмеченные свойства foreach (var property in properties) { property.SetValue(obj, InstanceCreationHelper.GetPropertyDependency(property, container)); } // И методы foreach (var setter in setters) { var parameters = InstanceCreationHelper.GetMethodDependencies(setter, container); setter.Invoke(obj, parameters); } return(obj); } catch (TargetInvocationException e) { throw e.InnerException ?? e; } }
/// <summary> /// Создать экземпляр класса, используя внедрение зависимостей в один из его конструкторов /// </summary> /// <param name="container">Контейнер, в котором создаётся экземпляр</param> /// <returns>Экземпляр класса, с внедрёнными в него зависимостями</returns> public object BuildInstance(IContainer container) { // Получаем параметры конструктора object?[] parameters = InstanceCreationHelper .GetMethodDependencies(constructor, container); try { return(constructor.Invoke(parameters)); } catch (TargetInvocationException e) { throw e.InnerException ?? e; } }
/// <summary> /// Создать экземпляр класса, используя конструктор по-умолчанию и внедрение зависимостей с помощью одного из его методов /// </summary> /// <param name="container">Контейнер, в котором создаётся экземпляр</param> /// <returns>Экземпляр класса, с внедрёнными в него зависимостями</returns> public object BuildInstance(IContainer container) { try { // Создаём объект var obj = constructor.Invoke(Type.EmptyTypes); // Получаем его зависимости var methodParameters = InstanceCreationHelper.GetMethodDependencies(method, container); // И внедряем их с помощью метода method.Invoke(obj, methodParameters); return(obj); } catch (TargetInvocationException e) { throw e.InnerException ?? e; } }