Esempio n. 1
0
        private object CreateDependency(ImplementationInfo implementation)
        {
            ConstructorInfo[] constructors = implementation.ImplementationType.GetConstructors();
            if (constructors.Length < 1)
            {
                // no public constructors
                return(null);
            }
            constructors = constructors.OrderByDescending(c => c.GetParameters().Length).ToArray();

            foreach (var constructor in constructors)
            {
                ParameterInfo[] parameters    = constructor.GetParameters();
                List <object>   createdParams = new List <object>();
                if (parameters.All(p => _depConfigs.Dependecies.ContainsKey(p.ParameterType)))
                {
                    List <ImplementationInfo> implementations;
                    foreach (var parameter in parameters)
                    {
                        _depConfigs.Dependecies.TryGetValue(parameter.ParameterType, out implementations);
                        if (typeof(IEnumerable).IsAssignableFrom(parameter.ParameterType))
                        {
                            Type          genericType  = parameter.ParameterType.GetGenericArguments()[0];
                            List <object> createdImpls = new List <object>();
                            foreach (var impl in implementations)
                            {
                                createdImpls.Add(CreateDependency(impl));
                            }
                            createdParams.Add(createdImpls.AsEnumerable());
                        }
                        else
                        {
                            if (implementations.Count == 1)
                            {
                                createdParams.Add(CreateDependency(implementations[0]));
                            }
                        }
                    }
                }
                if (implementation.Lifetime == DependencyLifetime.Singleton)
                {
                    return(GetOrCreateSingleton(implementation.ImplementationType, createdParams));
                }
                else
                {
                    return(CreateObject(implementation.ImplementationType, createdParams));
                }
            }
            return(null);
        }
Esempio n. 2
0
        public object Resolve <T>()
            where T : class
        {
            if (!ValidateConfiguration(typeof(T)))
            {
                // bad configuration
                return(null);
            }

            List <ImplementationInfo> implementations;

            if (typeof(IEnumerable).IsAssignableFrom(typeof(T)))
            {
                Type          genericType  = typeof(T).GetGenericArguments()[0];
                List <object> createdImpls = new List <object>();
                _depConfigs.Dependecies.TryGetValue(genericType, out implementations);
                foreach (var impl in implementations)
                {
                    createdImpls.Add(CreateDependency(impl));
                }
                return(createdImpls.AsEnumerable());
            }

            if (typeof(T).IsGenericType)
            {
                Type genericBase     = typeof(T).GetGenericTypeDefinition();
                Type genericArgument = typeof(T).GetGenericArguments()[0];

                _depConfigs.Dependecies.TryGetValue(genericBase, out implementations);
                if (implementations.Count > 1)
                {
                    // must be 1
                    return(null);
                }
                ImplementationInfo impl = new ImplementationInfo(implementations[0].ImplementationType.MakeGenericType(genericArgument),
                                                                 implementations[0].Lifetime);
                return(CreateDependency(impl) as T);
            }

            _depConfigs.Dependecies.TryGetValue(typeof(T), out implementations);
            if (implementations.Count > 1)
            {
                // must be 1
                return(null);
            }
            return(CreateDependency(implementations[0]) as T);
        }