/// <summary> /// Choose the constructor to call for the given type. /// </summary> /// <param name="context">Current build context</param> /// <param name="resolverPolicyDestination">The <see cref='IPolicyList'/> to add any /// generated resolver objects into.</param> /// <returns>The chosen constructor.</returns> public SelectedConstructor SelectConstructor(IBuilderContext context, IPolicyList resolverPolicyDestination) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var typeToConstruct = context.BuildKey.Type; var constructors = typeToConstruct.GetConstructors(); var selectedConstructor = SelectConstructor(constructors.Where(ctor => ctor.IsDefined(typeof(InjectionAttribute), true)).ToArray()) ?? SelectConstructor(constructors.Where(ctor => ctor.IsDefined(typeof(InjectionConstructorAttribute), true)).ToArray()) ?? SelectConstructor(constructors); if (selectedConstructor != null) { var result = new SelectedConstructor(selectedConstructor); foreach (var parameter in selectedConstructor.GetParameters()) { var attrs = parameter.GetCustomAttributes <DependencyResolutionAttribute>(false).ToArray(); if (attrs.Length > 0) { // Since this attribute is defined with MultipleUse = false, the compiler will // enforce at most one. So we don't need to check for more. result.AddParameterResolver(attrs[0].CreateResolver(parameter.ParameterType)); } else { // No attribute, just go back to the container for the default for that type. result.AddParameterResolver(new NamedTypeDependencyResolverPolicy(parameter.ParameterType, null)); } } return(result); } return(null); }
public SelectedConstructor SelectConstructor(IBuilderContext context, IPolicyList resolverPoliciesDestination) { var selectedConstructor = new SelectedConstructor(typeof(T).GetConstructor(new[] { typeof(object) })); selectedConstructor.AddParameterResolver(this.parameterResolverPolicy); return(selectedConstructor); }
public SelectedConstructor SelectConstructor(IBuilderContext context, IPolicyList resolverPoliciesDestination) { var ctr = typeof(InjectedObject).GetMatchingConstructor(new[] { typeof(object) }); var selectedConstructor = new SelectedConstructor(ctr); selectedConstructor.AddParameterResolver(this.resolverPolicy); return(selectedConstructor); }
private SelectedConstructor CreateSelectedConstructor(ConstructorInfo ctor, IBuilderContext context) { var result = new SelectedConstructor(ctor); foreach (ParameterInfo param in ctor.GetParameters()) { result.AddParameterResolver(param.HasDefaultValue ? context.Container.CanResolve(param.ParameterType)? ResolveParameter(param): new LiteralValueDependencyResolverPolicy(null) : ResolveParameter(param)); } return(result); }
private SelectedConstructor CreateSelectedConstructor(ConstructorInfo ctor) { var result = new SelectedConstructor(ctor); foreach (ParameterInfo param in ctor.GetParameters()) { result.AddParameterResolver(ResolveParameter(param)); } return(result); }
private SelectedConstructor CreateSelectedConstructor(IBuilderContext context, ConstructorInfo ctor) { SelectedConstructor selectedConstructor = new SelectedConstructor(ctor); foreach (ParameterInfo parameter in ctor.GetParameters()) { selectedConstructor.AddParameterResolver(this.CreateResolver(context, ctor, parameter)); } return(selectedConstructor); }
private static SelectedConstructor FindNewConstructor(SelectedConstructor originalConstructor, Type interceptingType) { ParameterInfo[] originalParams = originalConstructor.Constructor.GetParameters(); ConstructorInfo newConstructorInfo = interceptingType.GetConstructor(originalParams.Select(pi => pi.ParameterType).ToArray()); SelectedConstructor newConstructor = new SelectedConstructor(newConstructorInfo); foreach (IDependencyResolverPolicy resolver in originalConstructor.GetParameterResolvers()) { newConstructor.AddParameterResolver(resolver); } return(newConstructor); }
public SelectedConstructor SelectConstructor(IBuilderContext context, IPolicyList resolverPoliciesDestination) { var ctr = typeof(InjectedObject).GetMatchingConstructor(new[] { typeof(object) }); var selectedConstructor = new SelectedConstructor(ctr); selectedConstructor.AddParameterResolver(this.resolverPolicy); return selectedConstructor; }