public static IEnumerable <ZenjectResolveException> ValidateObjectGraph(
            DiContainer container, Type concreteType, params Type[] extras)
        {
            using (container.PushLookup(concreteType))
            {
                var dependencies = InjectablesFinder.GetAllInjectables(concreteType);
                var extrasList   = extras.ToList();

                foreach (var dependInfo in dependencies)
                {
                    Assert.IsEqual(dependInfo.EnclosingType, concreteType);

                    if (TryTakingFromExtras(dependInfo.ContractType, extrasList))
                    {
                        continue;
                    }

                    var context = new ResolveContext(
                        dependInfo, container.LookupsInProgress.ToList(), null);

                    foreach (var error in ValidateContract(
                                 container, dependInfo.ContractType, context, dependInfo.Optional))
                    {
                        yield return(error);
                    }
                }

                if (!extrasList.IsEmpty())
                {
                    yield return(new ZenjectResolveException(
                                     "Found unnecessary extra parameters passed when injecting into '{0}' with types '{1}'.  \nObject graph:\n{2}"
                                     .With(concreteType.Name(), String.Join(",", extrasList.Select(x => x.Name()).ToArray()), container.GetCurrentObjectGraph())));
                }
            }
        }
Example #2
0
        public static void Inject(DiContainer container, object injectable, IEnumerable <object> additional, bool shouldUseAll)
        {
            Assert.That(injectable != null);

            var additionalCopy = additional.ToList();

            var injectInfos = InjectablesFinder.GetFieldAndPropertyInjectables(injectable.GetType());

            foreach (var injectInfo in injectInfos)
            {
                bool didInject = InjectFromExtras(injectInfo, injectable, additionalCopy);

                if (!didInject)
                {
                    InjectFromResolve(injectInfo, container, injectable);
                }
            }

            if (shouldUseAll && !additionalCopy.IsEmpty())
            {
                throw new ZenjectResolveException(
                          "Passed unnecessary parameters when injecting into type '{0}'. \nExtra Parameters: {1}\nObject graph:\n{2}"
                          .With(injectable.GetType().Name(), String.Join(",", additionalCopy.Select(x => x.GetType().Name()).ToArray()), container.GetCurrentObjectGraph()));
            }

            foreach (var methodInfo in InjectablesFinder.GetPostInjectMethods(injectable.GetType()))
            {
                methodInfo.Invoke(injectable, new object[0]);
            }
        }
Example #3
0
        public IEnumerable <Type> GetDependencyContracts(Type contract)
        {
            Assert.That(!_hasDisposed);

            foreach (var injectMember in InjectablesFinder.GetAllInjectables(contract, false))
            {
                yield return(injectMember.ContractType);
            }
        }
Example #4
0
        object InstantiateInternal(
            Type concreteType, params object[] constructorArgs)
        {
            ConstructorInfo method;
            var             injectInfos = InjectablesFinder.GetConstructorInjectables(concreteType, out method);

            var paramValues = new List <object>();
            var extrasList  = new List <object>(constructorArgs);

            Assert.That(!extrasList.Contains(null),
                        "Null value given to factory constructor arguments. This is currently not allowed");

            foreach (var injectInfo in injectInfos)
            {
                var found = false;

                foreach (var extra in extrasList)
                {
                    if (extra.GetType().DerivesFromOrEqual(injectInfo.ContractType))
                    {
                        found = true;
                        paramValues.Add(extra);
                        extrasList.Remove(extra);
                        break;
                    }
                }

                if (!found)
                {
                    paramValues.Add(_container.Resolve(injectInfo));
                }
            }

            object newObj;

            try
            {
                newObj = method.Invoke(paramValues.ToArray());
            }
            catch (Exception e)
            {
                throw new ZenjectResolveException(
                          "Error occurred while instantiating object with type '{0}'".With(concreteType.Name()), e);
            }

            FieldsInjecter.Inject(_container, newObj, extrasList, true);

            return(newObj);
        }