private RegisteredType GetRegisterType(Type typeToResolve)
        {
            RegisteredType registeredType = null;

            if (_registeredObjects.ContainsKey(typeToResolve))
            {
                registeredType = _registeredObjects[typeToResolve];
            }

            else if (!typeToResolve.IsInterface)
            {
                registeredType = new RegisteredType(typeToResolve, typeToResolve, LifeCycle.Transient);
                _registeredObjects.Add(typeToResolve, registeredType);
            }

            return(registeredType);
        }
        public void Register <TResolveFrom, TResolveto>(LifeCycle lifeCycle)
            where TResolveto : class
            where TResolveFrom : class
        {
            var typeOfResolveFrom = typeof(TResolveFrom);
            var typeOfResolveTo   = typeof(TResolveto);
            var registeredType    = new RegisteredType(typeOfResolveFrom, typeOfResolveTo, lifeCycle);

            if (_registeredObjects.ContainsKey(typeOfResolveFrom))
            {
                _registeredObjects[typeOfResolveFrom] = registeredType;
            }
            else
            {
                _registeredObjects.Add(typeOfResolveFrom, registeredType);
            }
        }
 private object ResolveConstructorParameters(RegisteredType registeredType)
 {
     try
     {
         var constructor = registeredType
                           .ConcreteType
                           .GetConstructors()
                           .OrderByDescending(x => x.GetParameters().Length)
                           .First();
         var constructorParameterInstances = GetInstancesFor(constructor.GetParameters());
         registeredType.CreateInstance(constructorParameterInstances);
     }
     catch (ConstructorNotFoundException)
     {
         throw new ConstructorNotFoundException(registeredType.ToString());
     }
     return(registeredType.Instance);
 }
        public object Resolve(Type typeToResolve)
        {
            if (typeToResolve == null)
            {
                return(null);
            }

            RegisteredType registeredType = GetRegisterType(typeToResolve);

            if (registeredType == null)
            {
                throw new TypeNotRegisteredException(typeToResolve?.FullName);
            }

            var isSingletonAndIsInstanceCreated = registeredType.LifeCycle == LifeCycle.Singleton &&
                                                  registeredType.Instance != null;

            return(isSingletonAndIsInstanceCreated ? registeredType.Instance : ResolveConstructorParameters(registeredType));
        }