private object CreateInstance(Type type) { object result = null; if (!_typesInGeneration.Contains(type)) { _typesInGeneration.Add(type); if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(IEnumerable <>))) { result = CreateIEnumerable(type); _typesInGeneration.Remove(type); } else { if (type.IsGenericType && (type.GenericTypeArguments.Length > 0)) { Type nestedType = type.GenericTypeArguments[0]; DependenciesImpls impls = null; DependenciesImpls implsOfNestedType = null; var typeOpenGeneric = type.GetGenericTypeDefinition(); DependencyDetails generic = null; DependencyDetails nested = null; if ((_configuration.Dependencies.TryGetValue(type, out impls) || (_configuration.Dependencies.TryGetValue(type.GetGenericTypeDefinition(), out impls))) && _configuration.Dependencies.TryGetValue(nestedType, out implsOfNestedType)) { generic = impls.ImplTypes[impls.ImplTypes.Count - 1]; nested = implsOfNestedType.ImplTypes[implsOfNestedType.ImplTypes.Count - 1]; result = GenerateGenericDependency(generic, nestedType); _typesInGeneration.Remove(type); } } else { if (_configuration.Dependencies.TryGetValue(type, out DependenciesImpls details)) { var dependency = details.ImplTypes[details.ImplTypes.Count - 1]; result = GenerateDependency(dependency); _typesInGeneration.Remove(type); } } } } return(result); }
private object GenerateDependency(DependencyDetails dependency) { if (dependency.IsSingleton) { lock (_locker) { if (dependency.Instance != null) { return(dependency.Instance); } else { dependency.Instance = GenerateDependencyByConstructor(dependency.ImplType); return(dependency.Instance); } } } return(GenerateDependencyByConstructor(dependency.ImplType)); }
private object GenerateGenericDependency(DependencyDetails dependency, Type nestedType) { if (dependency.IsSingleton) { lock (_locker) { if ((dependency.Instance != null) && (dependency.NestedType == nestedType)) { return(dependency.Instance); } else if (dependency.NestedType != nestedType) { dependency.NestedType = nestedType; } dependency.Instance = GenerateDependencyByConstructor(MakeGenericTypeWithNestedType(dependency.ImplType, nestedType)); return(dependency.Instance); } } else { return(GenerateDependencyByConstructor(MakeGenericTypeWithNestedType(dependency.ImplType, nestedType))); } }
public void AddTypeToList(bool isSingleton, Type implType, Type nestedType) { var dependency = new DependencyDetails(isSingleton, implType, implType.IsGenericType, nestedType); ImplTypes.Add(dependency); }