public bool IsTypeRegistered(Type serviceType, object tag = null)
{
Argument.IsNotNull("serviceType", serviceType);
var serviceInfo = new ServiceInfo(serviceType, tag);
lock (_lockObject)
{
if (_registeredInstances.ContainsKey(serviceInfo))
{
return true;
}
if (_registeredTypes.ContainsKey(serviceInfo))
{
return true;
}
// CTL-161, support generic types
if (serviceType.IsGenericTypeEx())
{
var genericArguments = serviceType.GetGenericArgumentsEx().ToList();
var hasRealGenericArguments = (from genericArgument in genericArguments
where !string.IsNullOrEmpty(genericArgument.FullName)
select genericArgument).Any();
if (hasRealGenericArguments)
{
var genericType = serviceType.GetGenericTypeDefinitionEx();
var isOpenGenericTypeRegistered = IsTypeRegistered(genericType, tag);
if (isOpenGenericTypeRegistered)
{
Log.Debug("An open generic type '{0}' is registered, registering new closed generic type '{1}' based on the open registration", genericType.GetSafeFullName(false), serviceType.GetSafeFullName(false));
var registrationInfo = GetRegistrationInfo(genericType, tag);
var finalType = registrationInfo.ImplementingType.MakeGenericType(genericArguments.ToArray());
RegisterType(serviceType, finalType, tag, registrationInfo.RegistrationType);
return true;
}
}
}
// CTL-271 Support generic lists (array specific type)
// TODO: Can register,
// Last resort
var missingTypeHandler = MissingType;
if (missingTypeHandler != null)
{
var eventArgs = new MissingTypeEventArgs(serviceType);
missingTypeHandler(this, eventArgs);
if (eventArgs.ImplementingInstance != null)
{
Log.Debug("Late registering type '{0}' to instance of type '{1}' via MissingTypeEventArgs.ImplementingInstance", serviceType.FullName, eventArgs.ImplementingInstance.GetType().FullName);
RegisterInstance(serviceType, eventArgs.ImplementingInstance, eventArgs.Tag, this);
return true;
}
if (eventArgs.ImplementingType != null)
{
Log.Debug("Late registering type '{0}' to type '{1}' via MissingTypeEventArgs.ImplementingType", serviceType.FullName, eventArgs.ImplementingType.FullName);
RegisterType(serviceType, eventArgs.ImplementingType, eventArgs.Tag, eventArgs.RegistrationType, true, this, null);
return true;
}
}
}
return false;
}