コード例 #1
0
        IEnumerable<RegistrationFactory> RegistrationConvention.GetTypeRegistrations(RegistrationCatalog catalog,
            Type type)
        {
            for (int i = 0; i < _conventions.Length; i++)
            {
                RegistrationFactory[] registrations = _conventions[i].GetTypeRegistrations(catalog, type).ToArray();
                if (registrations.Length > 0)
                    return registrations;
            }

            return Enumerable.Empty<RegistrationFactory>();
        }
コード例 #2
0
        public IEnumerable<RegistrationFactory> GetTypeRegistrations(RegistrationCatalog catalog, Type type)
        {
            if (type.IsConcreteType())
            {
                RegistrationFactory[] defaultConstructor = GetDefaultConstructor(type).ToArray();
                if (defaultConstructor.Any())
                    return defaultConstructor;

                RegistrationFactory[] greediestConstructor = GetGreediestConstructor(catalog, type).ToArray();
                if (greediestConstructor.Any())
                    return greediestConstructor;
            }

            return Enumerable.Empty<RegistrationFactory>();
        }
コード例 #3
0
        IEnumerable<RegistrationFactory> GetConstructorRegistrations(RegistrationCatalog catalog, Type type,
            ConstructorInfo constructorInfo, IEnumerable<Type> dependencies)
        {
            ParameterInfo[] parameters = constructorInfo.GetParameters();

            RegistrationFactory[] arguments = dependencies
                .Select((x, index) => catalog.GetRegistration(parameters[index].ParameterType)).ToArray();

            if (parameters.Length == arguments.Length)
            {
                RegistrationFactory factory = ConstructorRegistrationFactory.Create(type, constructorInfo, arguments);

                return arguments.Concat(Enumerable.Repeat(factory, 1));
            }

            return Enumerable.Empty<RegistrationFactory>();
        }
コード例 #4
0
        IEnumerable<RegistrationFactory> GetGreediestConstructor(RegistrationCatalog catalog, Type type)
        {
            IOrderedEnumerable<ConstructorInfo> candidates = type.GetConstructors()
                .OrderByDescending(x => x.GetParameters().Length);

            foreach (ConstructorInfo candidate in candidates)
            {
                Type[] dependencies = candidate.GetParameters().Select(x => x.ParameterType).ToArray();

                RegistrationFactory[] registrations =
                    GetConstructorRegistrations(catalog, type, candidate, dependencies).ToArray();

                if (registrations.Any())
                    return registrations;
            }

            return Enumerable.Empty<RegistrationFactory>();
        }