/// <summary> /// Registers all supplied <paramref name="implementationTypes"/> based on the closed-generic version /// of the given <paramref name="openGenericServiceType"/> with the given <paramref name="lifestyle"/>. /// </summary> /// <param name="openGenericServiceType">The definition of the open generic type.</param> /// <param name="implementationTypes">A list types to be registered.</param> /// <param name="lifestyle">The lifestyle to register instances with.</param> /// <exception cref="ArgumentNullException">Thrown when one of the arguments contain a null /// reference (Nothing in VB).</exception> /// <exception cref="ArgumentException">Thrown when <paramref name="openGenericServiceType"/> is not /// an open generic type or when one of the supplied types from the /// <paramref name="implementationTypes"/> collection does not derive from /// <paramref name="openGenericServiceType"/>.</exception> /// <exception cref="InvalidOperationException">Thrown when the given set of /// <paramref name="implementationTypes"/> contain multiple types that implement the same /// closed generic version of the given <paramref name="openGenericServiceType"/>.</exception> public void Register(Type openGenericServiceType, IEnumerable <Type> implementationTypes, Lifestyle lifestyle) { Requires.IsNotNull(openGenericServiceType, nameof(openGenericServiceType)); Requires.IsNotNull(lifestyle, nameof(lifestyle)); Requires.IsNotNull(implementationTypes, nameof(implementationTypes)); Requires.IsGenericType(openGenericServiceType, nameof(openGenericServiceType), guidance: StringResources.SuppliedTypeIsNotGenericExplainingAlternativesWithTypes); Requires.IsNotPartiallyClosed(openGenericServiceType, nameof(openGenericServiceType)); Requires.IsOpenGenericType(openGenericServiceType, nameof(openGenericServiceType), guidance: StringResources.SuppliedTypeIsNotOpenGenericExplainingAlternativesWithTypes); implementationTypes = implementationTypes.Distinct().ToArray(); Requires.DoesNotContainNullValues(implementationTypes, nameof(implementationTypes)); Requires.CollectionDoesNotContainOpenGenericTypes(implementationTypes, nameof(implementationTypes)); Requires.ServiceIsAssignableFromImplementations(openGenericServiceType, implementationTypes, nameof(implementationTypes), typeCanBeServiceType: false); var mappings = from mapping in BatchMapping.Build(openGenericServiceType, implementationTypes) let registration = lifestyle.CreateRegistration(mapping.ImplementationType, this) from serviceType in mapping.ClosedServiceTypes select new { serviceType, registration }; foreach (var mapping in mappings) { this.AddRegistration(mapping.serviceType, mapping.registration); } }
/// <summary> /// Registers all concrete, non-generic, public and internal types in the given set of /// <paramref name="assemblies"/> that implement the given <paramref name="openGenericServiceType"/> /// with the supplied <paramref name="lifestyle"/>. /// <see cref="TypesToRegisterOptions.IncludeDecorators">Decorators</see> and /// <see cref="TypesToRegisterOptions.IncludeGenericTypeDefinitions">generic type definitions</see> /// will be excluded from registration, while /// <see cref="TypesToRegisterOptions.IncludeComposites">composites</see> are included. /// </summary> /// <param name="openGenericServiceType">The definition of the open generic type.</param> /// <param name="assemblies">A list of assemblies that will be searched.</param> /// <param name="lifestyle">The lifestyle to register instances with.</param> /// <exception cref="ArgumentNullException">Thrown when one of the arguments contain a null /// reference.</exception> /// <exception cref="ArgumentException">Thrown when <paramref name="openGenericServiceType"/> is not /// an open generic type.</exception> /// <exception cref="InvalidOperationException">Thrown when the given set of /// <paramref name="assemblies"/> contain multiple types that implement the same /// closed generic version of the given <paramref name="openGenericServiceType"/>.</exception> public void Register( Type openGenericServiceType, IEnumerable <Assembly> assemblies, Lifestyle lifestyle) { Requires.IsNotNull(openGenericServiceType, nameof(openGenericServiceType)); Requires.IsNotNull(lifestyle, nameof(lifestyle)); Requires.IsNotNull(assemblies, nameof(assemblies)); Requires.IsGenericType( openGenericServiceType, nameof(openGenericServiceType), guidance: StringResources.SuppliedTypeIsNotGenericExplainingAlternativesWithAssemblies); Requires.IsNotPartiallyClosed(openGenericServiceType, nameof(openGenericServiceType)); Requires.IsOpenGenericType( openGenericServiceType, nameof(openGenericServiceType), guidance: StringResources.SuppliedTypeIsNotOpenGenericExplainingAlternativesWithAssemblies); var results = this.GetNonGenericTypesToRegisterForOneToOneMapping(openGenericServiceType, assemblies); this.Register(openGenericServiceType, results.ImplementationTypes, lifestyle); this.AddSkippedDecorators(openGenericServiceType, results.SkippedDecorators); }
private void RegisterOpenGeneric(Type serviceType, Type implementationType, Lifestyle lifestyle, Predicate <PredicateContext> predicate = null) { Requires.IsGenericType(serviceType, nameof(serviceType)); Requires.IsNotPartiallyClosed(serviceType, nameof(serviceType)); Requires.ServiceOrItsGenericTypeDefinitionIsAssignableFromImplementation(serviceType, implementationType, nameof(serviceType)); Requires.OpenGenericTypeDoesNotContainUnresolvableTypeArguments(serviceType, implementationType, nameof(implementationType)); this.GetOrCreateRegistrationalEntry(serviceType) .AddGeneric(serviceType, implementationType, lifestyle, predicate); }
/// <summary> /// Registers all concrete, non-generic, public and internal types in the given set of /// <paramref name="assemblies"/> that implement the given <paramref name="openGenericServiceType"/> /// with the supplied <paramref name="lifestyle"/>. /// </summary> /// <param name="openGenericServiceType">The definition of the open generic type.</param> /// <param name="assemblies">A list of assemblies that will be searched.</param> /// <param name="lifestyle">The lifestyle to register instances with.</param> /// <exception cref="ArgumentNullException">Thrown when one of the arguments contain a null /// reference (Nothing in VB).</exception> /// <exception cref="ArgumentException">Thrown when <paramref name="openGenericServiceType"/> is not /// an open generic type.</exception> /// <exception cref="InvalidOperationException">Thrown when the given set of /// <paramref name="assemblies"/> contain multiple types that implement the same /// closed generic version of the given <paramref name="openGenericServiceType"/>.</exception> public void Register(Type openGenericServiceType, IEnumerable <Assembly> assemblies, Lifestyle lifestyle) { Requires.IsNotNull(openGenericServiceType, "openGenericServiceType"); Requires.IsNotNull(lifestyle, "lifestyle"); Requires.IsNotNull(assemblies, "assemblies"); Requires.IsGenericType(openGenericServiceType, "openGenericServiceType", guidance: StringResources.SuppliedTypeIsNotGenericExplainingAlternativesWithAssemblies); Requires.IsNotPartiallyClosed(openGenericServiceType, "openGenericServiceType"); Requires.IsOpenGenericType(openGenericServiceType, "openGenericServiceType", guidance: StringResources.SuppliedTypeIsNotOpenGenericExplainingAlternativesWithAssemblies); var implementationTypes = this.GetTypesToRegister(openGenericServiceType, assemblies); this.Register(openGenericServiceType, implementationTypes, lifestyle); }