コード例 #1
0
        /// <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");
        }
コード例 #2
0
        /// <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;
            }
        }
コード例 #3
0
 /// <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;
     }
 }
コード例 #4
0
 /// <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;
     }
 }