protected virtual object[] GetParameterValues(Type targetType, IInjector injector)
        {
            if (_parameters == null)
            {
                return(new object[0]);
            }

            List <object> parameters = new List <object>();

            ParameterInfo[] parameterInfos = _parameters;
            int             length         = parameterInfos.Length;

            for (int i = 0; i < length; i++)
            {
                Type parameterType = parameterInfos[i].ParameterType;
                var  isLazy        = parameterType.IsGenericType && parameterType.GetGenericTypeDefinition() == typeof(Lazy <>);
                var  provider      = injector.GetResolver(isLazy ? parameterType.GetGenericArguments()[0] : parameterType, true);
                if (provider == null)
                {
                    if (parameterInfos[i].IsOptional)
                    {
                        parameters.Add(parameterInfos[i].DefaultValue);
                        continue;
                    }
                    if (_optional)
                    {
                        parameters.Add(null);
                        continue; //TODO: Check optional parameters are in order (last) for this break to work, else use continue
                    }
                    throw new InvalidOperationException(
                              "Injector is missing a mapping to handle constructor injection into target type '"
                              + targetType.FullName + "'. \nTarget dependency: " + parameterType.FullName +
                              ", method: " + _name + ", parameter: " + (i + 1)
                              );
                }
                parameters.Add(provider.Resolve(injector, targetType));
            }
            return(parameters.ToArray());
        }
Esempio n. 2
0
        public override void Apply(object target, Type targetType, IInjector injector)
        {
            var provider = injector.GetResolver(ProviderType, true);

            SetValue(target, provider.Resolve(injector, targetType));
        }