예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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.");
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
 public object BuildInstance(IDiContainer di, Type[] genericArguments, DiBuildInstanceType buildInstanceType)
 {
     return(obj);
 }