public void SelectConstructorWith2Parameters() { ConstructorInfo ctor = typeof(ClassWithConstructorParameters).GetMatchingConstructor(Types(typeof(int), typeof(string))); var policy = new SpecifiedConstructorSelectorPolicy(ctor, new InjectionParameterValue[] { new InjectionParameter <int>(37), new InjectionParameter <string>("abc") }); var builderContext = new BuilderContextMock(new NamedTypeBuildKey(typeof(ClassWithConstructorParameters))); SelectedConstructor selectedCtor = policy.SelectConstructor(builderContext, builderContext.PersistentPolicies); Assert.Equal(ctor, selectedCtor.Constructor); Assert.Equal(2, selectedCtor.GetParameterResolvers().Length); var resolvers = selectedCtor.GetParameterResolvers(); Assert.Equal(2, resolvers.Length); foreach (var resolverPolicy in resolvers) { AssertPolicyIsCorrect(resolverPolicy); } }
public void InjectionConstructorInsertsChooserForConstructorWithParameters() { string expectedString = "Hello"; int expectedInt = 12; var ctor = new InjectionConstructor(expectedString, expectedInt); var context = new MockBuilderContext { BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)) }; IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get <IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); var resolvers = selected.GetParameterResolvers(); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(Sequence.Collect(typeof(string), typeof(int))), selected.Constructor); Assert.Equal(2, resolvers.Length); Assert.Equal(expectedString, (string)resolvers[0].Resolve(null)); Assert.Equal(expectedInt, (int)resolvers[1].Resolve(null)); }
public void SelectConstructorWithNoParameters() { ConstructorInfo ctor = typeof(ClassWithSimpleConstructor).GetMatchingConstructor(new Type[0]); var policy = new SpecifiedConstructorSelectorPolicy(ctor, new InjectionParameterValue[0]); var builderContext = new BuilderContextMock(new NamedTypeBuildKey(typeof(ClassWithSimpleConstructor))); SelectedConstructor selectedCtor = policy.SelectConstructor(builderContext, new PolicyList()); Assert.Equal(ctor, selectedCtor.Constructor); Assert.Equal(0, selectedCtor.GetParameterResolvers().Length); }
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); }
private static void ResolveConstructorParameters(SelectedConstructor constructor, Dictionary <string, StepScopeDependency> constructorParameters) { var parameterResolvers = constructor.GetParameterResolvers(); for (var i = 0; i < parameterResolvers.Length; i++) { var namedTypeResolver = parameterResolvers[i] as NamedTypeDependencyResolverPolicy; if (namedTypeResolver != null) { var type = namedTypeResolver.Type; var name = namedTypeResolver.Name; if (StepScopeSynchronization.IsStepScope(type, name)) { var parameter = constructor.Constructor.GetParameters()[i]; constructorParameters[parameter.Name] = new StepScopeDependency(type, name); } } } }
private IEnumerable <Expression> BuildConstructionParameterExpressions(DynamicBuildPlanGenerationContext buildContext, SelectedConstructor selectedConstructor, string constructorSignature) { int i = 0; var constructionParameters = selectedConstructor.Constructor.GetParameters(); foreach (IDependencyResolverPolicy parameterResolver in selectedConstructor.GetParameterResolvers()) { yield return(buildContext.CreateParameterExpression( parameterResolver, constructionParameters[i].ParameterType, Expression.Call(null, SetCurrentOperationToResolvingParameterMethod, Expression.Constant(constructionParameters[i].Name, typeof(string)), Expression.Constant(constructorSignature), buildContext.ContextParameter))); i++; } }
public void InjectionConstructorInsertsChooserForDefaultConstructor() { var ctor = new InjectionConstructor(); var context = new MockBuilderContext { BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)) }; IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get <IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(new Type[0]), selected.Constructor); Assert.Equal(0, selected.GetParameterResolvers().Length); }
public void InjectionConstructorSetsResolverForInterfaceToLookupInContainer() { var ctor = new InjectionConstructor("Logger", typeof(ILogger)); var context = new MockBuilderContext(); context.BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)); IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get <IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); var resolvers = selected.GetParameterResolvers(); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(Sequence.Collect(typeof(string), typeof(ILogger))), selected.Constructor); Assert.Equal(2, resolvers.Length); var policy = resolvers[1]; Assert.True(policy is NamedTypeDependencyResolverPolicy); }
private static void ResolveConstructorParameters(SelectedConstructor constructor, Dictionary<string, StepScopeDependency> constructorParameters) { var parameterResolvers = constructor.GetParameterResolvers(); for (var i = 0; i < parameterResolvers.Length; i++) { var namedTypeResolver = parameterResolvers[i] as NamedTypeDependencyResolverPolicy; if (namedTypeResolver != null) { var type = namedTypeResolver.Type; var name = namedTypeResolver.Name; if (StepScopeSynchronization.IsStepScope(type, name)) { var parameter = constructor.Constructor.GetParameters()[i]; constructorParameters[parameter.Name] = new StepScopeDependency(type, name); } } } }
private IEnumerable<Expression> BuildConstructionParameterExpressions(DynamicBuildPlanGenerationContext buildContext, SelectedConstructor selectedConstructor, string constructorSignature) { int i = 0; var constructionParameters = selectedConstructor.Constructor.GetParameters(); foreach (IDependencyResolverPolicy parameterResolver in selectedConstructor.GetParameterResolvers()) { yield return buildContext.CreateParameterExpression( parameterResolver, constructionParameters[i].ParameterType, Expression.Call(null, SetCurrentOperationToResolvingParameterMethod, Expression.Constant(constructionParameters[i].Name, typeof(string)), Expression.Constant(constructorSignature), buildContext.ContextParameter)); i++; } }