Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 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));
 }
Exemplo n.º 3
0
 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)));
     }
 }
Exemplo n.º 4
0
        public void AddTypeToList(bool isSingleton, Type implType, Type nestedType)
        {
            var dependency = new DependencyDetails(isSingleton, implType, implType.IsGenericType, nestedType);

            ImplTypes.Add(dependency);
        }