public object BuildInstance(IDiContainer di, Type[] genericArguments, DiBuildInstanceType buildInstanceType) { var resolvedCtor = ResolveGenerics(constructor, genericArguments); var parameters = resolvedCtor.GetParameters().Select(x => di.Get(x.ParameterType)).ToArray(); return(resolvedCtor.Invoke(parameters)); }
public object BuildInstance(IDiContainer di, Type[] genericArguments, DiBuildInstanceType buildInstanceType) { var resolvedMethod = method.IsGenericMethod ? method.MakeGenericMethod(genericArguments) : method; var parameters = resolvedMethod.GetParameters().Select(x => di.Get(x.ParameterType)).ToArray(); return(resolvedMethod.Invoke(obj, parameters)); }
public object BuildSingle(IDiContainer di, DiBuildInstanceType buildInstanceType) { if (abstractType.ContainsGenericParameters) { throw new InvalidOperationException($"Trying to obtain an instance of a non-complete generic type '{abstractType}'."); } foreach (var item in items) { if (item.Condition(di)) { return(item.Binding.BuildInstance(di, Type.EmptyTypes, buildInstanceType)); } } if (abstractType.IsGenericType) { var genericItems = GetGenericItems(di, DiRootBindingType.Single); foreach (var item in genericItems) { if (item.Condition(di)) { return(item.Binding.BuildInstance(di, abstractType.GetGenericArguments(), buildInstanceType)); } } } if (concreteTypeBinding != null) { return(concreteTypeBinding.BuildInstance(di, abstractType.GetGenericArguments(), buildInstanceType)); } throw new KeyNotFoundException($"No valid bindings found for '{abstractType.FullName}' implementations."); }
private object BuildResult(IDiContainer di, IDiRootBinding bindingLoc, DiBuildInstanceType buildInstanceType) { switch (rootBindingType) { case DiRootBindingType.Single: return(bindingLoc.BuildSingle(di, buildInstanceType)); case DiRootBindingType.Multi: return(bindingLoc.BuildMulti(di, buildInstanceType)); default: throw new ArgumentOutOfRangeException(); } }
public object BuildInstance(IDiContainer di, Type[] genericArguments, DiBuildInstanceType buildInstanceType) { var resolvedType = concreteType.IsGenericType ? concreteType.MakeGenericType(genericArguments) : concreteType; switch (buildInstanceType) { case DiBuildInstanceType.Singleton: return(di.Get(resolvedType)); case DiBuildInstanceType.NewEachTime: return(di.Instantiate(resolvedType)); default: throw new ArgumentOutOfRangeException(nameof(buildInstanceType), buildInstanceType, null); } }
public Array BuildMulti(IDiContainer di, DiBuildInstanceType buildInstanceType) { if (abstractType.ContainsGenericParameters) { throw new InvalidOperationException($"Trying to obtain an instance of a non-complete generic type '{abstractType}'."); } var ownResults = items.Where(x => x.Condition(di)).Select(x => x.Binding.BuildInstance(di, Type.EmptyTypes, buildInstanceType)); var genericResults = GetGenericItems(di, DiRootBindingType.Multi).Select(x => x.Binding.BuildInstance(di, abstractType.GetGenericArguments(), buildInstanceType)); var objArray = ownResults.Concat(genericResults).ToArray(); var typedArray = Array.CreateInstance(abstractType, objArray.Length); Array.Copy(objArray, typedArray, objArray.Length); return(typedArray); }
public object BuildInstance(IDiContainer di, Type[] genericArguments, DiBuildInstanceType buildInstanceType) { return(obj); }