private IEnumerable <ServiceRegistration> GetRegistrationsForType(Type type) { IEnumerable <ServiceRegistration> registrations = serviceRepository.GetOrDefaultByRef(type); if (!type.IsClosedGenericType()) { return(registrations); } var openGenerics = serviceRepository.GetOrDefaultByRef(type.GetGenericTypeDefinition()); if (openGenerics != null) { registrations = registrations == null ? openGenerics : openGenerics.Concat(registrations); } var variantGenerics = serviceRepository.Walk() .Where(r => r.Key.IsGenericType() && r.Key.GetGenericTypeDefinition() == type.GetGenericTypeDefinition() && r.Key != type && r.Key.ImplementsWithoutGenericCheck(type)) .SelectMany(r => r.Value).ToArray(); if (variantGenerics.Length > 0) { registrations = registrations == null ? variantGenerics : variantGenerics.Concat(registrations); } return(registrations); }
private IEnumerable <ServiceRegistration> GetRegistrationsForType(Type type) { var registrations = repository.GetOrDefaultByRef(type); return(!type.IsClosedGenericType() ? registrations : repository.GetOrDefaultByRef(type.GetGenericTypeDefinition())); }
public static bool ContainsRegistration(this ImmutableTree <Type, ImmutableBucket <object, ServiceRegistration> > repository, Type type, object name) { var registrations = repository.GetOrDefaultByRef(type); if (name != null && registrations != null) { return(registrations.GetOrDefaultByValue(name) != null); } if (registrations != null || !type.IsClosedGenericType()) { return(registrations != null); } registrations = repository.GetOrDefaultByRef(type.GetGenericTypeDefinition()); return(registrations?.Any(reg => type.SatisfiesGenericConstraintsOf(reg.ImplementationTypeInfo)) ?? false); }