in src/React.Core/TinyIoC/TinyIoC.cs [3590:3662]
private bool CanResolveInternal(TypeRegistration registration, NamedParameterOverloads parameters, ResolveOptions options)
{
if (parameters == null)
throw new ArgumentNullException("parameters");
Type checkType = registration.Type;
string name = registration.Name;
ObjectFactoryBase factory;
if (_RegisteredTypes.TryGetValue(new TypeRegistration(checkType, name), out factory))
{
if (factory.AssumeConstruction)
return true;
if (factory.Constructor == null)
return (GetBestConstructor(factory.CreatesType, parameters, options) != null) ? true : false;
else
return CanConstruct(factory.Constructor, parameters, options);
}
#if RESOLVE_OPEN_GENERICS
if (checkType.IsInterface() && checkType.IsGenericType())
{
// if the type is registered as an open generic, then see if the open generic is registered
if (_RegisteredTypes.TryGetValue(new TypeRegistration(checkType.GetGenericTypeDefinition(), name), out factory))
{
if (factory.AssumeConstruction)
return true;
if (factory.Constructor == null)
return (GetBestConstructor(factory.CreatesType, parameters, options) != null) ? true : false;
else
return CanConstruct(factory.Constructor, parameters, options);
}
}
#endif
// Fail if requesting named resolution and settings set to fail if unresolved
// Or bubble up if we have a parent
if (!string.IsNullOrEmpty(name) && options.NamedResolutionFailureAction == NamedResolutionFailureActions.Fail)
return (_Parent != null) ? _Parent.CanResolveInternal(registration, parameters, options) : false;
// Attemped unnamed fallback container resolution if relevant and requested
if (!string.IsNullOrEmpty(name) && options.NamedResolutionFailureAction == NamedResolutionFailureActions.AttemptUnnamedResolution)
{
if (_RegisteredTypes.TryGetValue(new TypeRegistration(checkType), out factory))
{
if (factory.AssumeConstruction)
return true;
return (GetBestConstructor(factory.CreatesType, parameters, options) != null) ? true : false;
}
}
// Check if type is an automatic lazy factory request
if (IsAutomaticLazyFactoryRequest(checkType))
return true;
// Check if type is an IEnumerable<ResolveType>
if (IsIEnumerableRequest(registration.Type))
return true;
// Attempt unregistered construction if possible and requested
// If we cant', bubble if we have a parent
if ((options.UnregisteredResolutionAction == UnregisteredResolutionActions.AttemptResolve) || (checkType.IsGenericType() && options.UnregisteredResolutionAction == UnregisteredResolutionActions.GenericsOnly))
return (GetBestConstructor(checkType, parameters, options) != null) ? true : (_Parent != null) ? _Parent.CanResolveInternal(registration, parameters, options) : false;
// Bubble resolution up the container tree if we have a parent
if (_Parent != null)
return _Parent.CanResolveInternal(registration, parameters, options);
return false;
}