in src/React.Core/TinyIoC/TinyIoC.cs [3721:3826]
private object ResolveInternal(TypeRegistration registration, NamedParameterOverloads parameters, ResolveOptions options)
{
ObjectFactoryBase factory;
// Attempt container resolution
if (_RegisteredTypes.TryGetValue(registration, out factory))
{
try
{
return factory.GetObject(registration.Type, this, parameters, options);
}
catch (TinyIoCResolutionException)
{
throw;
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(registration.Type, ex);
}
}
#if RESOLVE_OPEN_GENERICS
// Attempt container resolution of open generic
if (registration.Type.IsGenericType())
{
var openTypeRegistration = new TypeRegistration(registration.Type.GetGenericTypeDefinition(),
registration.Name);
if (_RegisteredTypes.TryGetValue(openTypeRegistration, out factory))
{
try
{
return factory.GetObject(registration.Type, this, parameters, options);
}
catch (TinyIoCResolutionException)
{
throw;
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(registration.Type, ex);
}
}
}
#endif
// Attempt to get a factory from parent if we can
var bubbledObjectFactory = GetParentObjectFactory(registration);
if (bubbledObjectFactory != null)
{
try
{
return bubbledObjectFactory.GetObject(registration.Type, this, parameters, options);
}
catch (TinyIoCResolutionException)
{
throw;
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(registration.Type, ex);
}
}
// Fail if requesting named resolution and settings set to fail if unresolved
if (!string.IsNullOrEmpty(registration.Name) && options.NamedResolutionFailureAction == NamedResolutionFailureActions.Fail)
throw new TinyIoCResolutionException(registration.Type);
// Attemped unnamed fallback container resolution if relevant and requested
if (!string.IsNullOrEmpty(registration.Name) && options.NamedResolutionFailureAction == NamedResolutionFailureActions.AttemptUnnamedResolution)
{
if (_RegisteredTypes.TryGetValue(new TypeRegistration(registration.Type, string.Empty), out factory))
{
try
{
return factory.GetObject(registration.Type, this, parameters, options);
}
catch (TinyIoCResolutionException)
{
throw;
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(registration.Type, ex);
}
}
}
#if EXPRESSIONS
// Attempt to construct an automatic lazy factory if possible
if (IsAutomaticLazyFactoryRequest(registration.Type))
return GetLazyAutomaticFactoryRequest(registration.Type);
#endif
if (IsIEnumerableRequest(registration.Type))
return GetIEnumerableRequest(registration.Type);
// Attempt unregistered construction if possible and requested
if ((options.UnregisteredResolutionAction == UnregisteredResolutionActions.AttemptResolve) || (registration.Type.IsGenericType() && options.UnregisteredResolutionAction == UnregisteredResolutionActions.GenericsOnly))
{
if (!registration.Type.IsAbstract() && !registration.Type.IsInterface())
return ConstructType(null, registration.Type, parameters, options);
}
// Unable to resolve - throw
throw new TinyIoCResolutionException(registration.Type);
}