public TypeFactoryMap GetMapForType(Type baseType, string name, bool isExplicitType, Stack<TypeFactoryMap> currentStack)
{
string key = name.ToLower();
Dictionary<string,TypeFactoryMap> typeLoaderMap = null;
if (!typeFactoryLoaderMap.TryGetValue(baseType, out typeLoaderMap))
{
lock(syncLock)
{
if (!typeFactoryLoaderMap.TryGetValue(baseType, out typeLoaderMap))
{
typeLoaderMap = new Dictionary<string,TypeFactoryMap>();
typeFactoryLoaderMap.Add(baseType,typeLoaderMap);
}
}
}
TypeFactoryMap returnMap = null;
if (!typeLoaderMap.TryGetValue(key, out returnMap))
{
lock(syncLock)
{
if (!typeLoaderMap.TryGetValue(key, out returnMap))
{
if (currentStack == null)
currentStack = new Stack<TypeFactoryMap>();
if (currentStack.Any(item => item.Name.ToLowerInvariant() == key && item.BaseType == baseType))
throw new ArgumentException("Mapping for type '" + baseType.FullName + "' on name '" + name + "' has a circular dependency.");
returnMap = new TypeFactoryMap(name, baseType, isExplicitType, this);
currentStack.Push(returnMap);
returnMap.Init(currentStack);
currentStack.Pop();
typeLoaderMap.Add(key,returnMap);
if (returnMap.Definition.IsSingleton)
GetBindingFromMap(returnMap);
}
}
}
return returnMap;
}