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>(); }
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>(); }
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>(); }
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>(); }