public Injector <T> Parse <T>(Kernel kernel, ObjectDescription description, out List <DependencyProvider> groupDepProviders) { var ctorConfigItem = _configGroup.ConstructorInjectionConfigurationItem; var ctorDepProviders = ctorConfigItem.CreateDependencyProviders(kernel, description, true); InjectorEmitBody emitBody; Type injectorType; ConstructorInfo injectorTypeConstructor; Injector <T> injector; var ctorEmitBody = new ConstructorEmitBody(kernel.EmitInjectorManager, ctorConfigItem.Constructor, ctorDepProviders); var memberConfigItems = _configGroup.MemberInjectionConfigurationItems; if (memberConfigItems == null) { emitBody = new InjectorEmitBody(description.ContractType, ctorEmitBody, null); injectorType = BuildDynamicInjectorType(kernel, emitBody); injectorTypeConstructor = GetConstructorOfDynamicInjectorType(injectorType, ctorDepProviders, null); injector = CreateDynamicInjector <T>(injectorTypeConstructor, ctorDepProviders, null); groupDepProviders = ctorDepProviders == null ? null : new List <DependencyProvider>(ctorDepProviders); return(injector); } List <DependencyProvider> allMemberDepProviders = null; var methodEmitBodySet = new MethodEmitBody[memberConfigItems.Count]; for (int i = 0; i < memberConfigItems.Count; i++) { var memberConfigItem = memberConfigItems[i]; var memberDepProviders = memberConfigItem.CreateDependencyProviders(kernel, description, true); if (memberDepProviders == null) { if (memberConfigItem.MemberKind == MemberKind.Property) { throw new ImpossibleException(); } methodEmitBodySet[i] = new MethodEmitBody(memberConfigItem.InjectionMethod, null); continue; } if (allMemberDepProviders == null) { allMemberDepProviders = new List <DependencyProvider>(); } allMemberDepProviders.AddRange(memberDepProviders); var paramEmitBodySet = new ParameterEmitBody[memberDepProviders.Length]; for (int j = 0; j < memberDepProviders.Length; j++) { paramEmitBodySet[j] = new ParameterEmitBody(memberDepProviders[j]); } methodEmitBodySet[i] = new MethodEmitBody(memberConfigItem.InjectionMethod, paramEmitBodySet); } emitBody = new InjectorEmitBody(description.ContractType, ctorEmitBody, methodEmitBodySet); injectorType = BuildDynamicInjectorType(kernel, emitBody); injectorTypeConstructor = GetConstructorOfDynamicInjectorType(injectorType, ctorDepProviders, allMemberDepProviders); injector = CreateDynamicInjector <T>(injectorTypeConstructor, ctorDepProviders, allMemberDepProviders); groupDepProviders = ctorDepProviders == null ? null : new List <DependencyProvider>(ctorDepProviders); if (groupDepProviders == null) { if (allMemberDepProviders != null) { groupDepProviders = allMemberDepProviders; } } else { if (allMemberDepProviders != null) { groupDepProviders.AddRange(allMemberDepProviders); } } return(injector); }
static Type BuildDynamicInjectorType(Kernel kernel, InjectorEmitBody emitBody) { var injectorManager = kernel.EmitInjectorManager; return(injectorManager.GetOrCreateInjectorType(emitBody)); }