private ContainerControlledCollection <TService> CreateInternal <TService>(
            IEnumerable <Type> serviceTypes)
            where TService : class
        {
            Requires.IsNotAnAmbiguousType(typeof(TService), nameof(TService));
            Requires.IsNotNull(serviceTypes, nameof(serviceTypes));

            // Make a copy for correctness and performance.
            serviceTypes = serviceTypes.ToArray();

            Requires.DoesNotContainNullValues(serviceTypes, nameof(serviceTypes));
            Requires.ServiceIsAssignableFromImplementations(typeof(TService), serviceTypes, nameof(serviceTypes),
                                                            typeCanBeServiceType: true);
            Requires.DoesNotContainOpenGenericTypesWhenServiceTypeIsNotGeneric(typeof(TService), serviceTypes,
                                                                               nameof(serviceTypes));
            Requires.OpenGenericTypesDoNotContainUnresolvableTypeArguments(typeof(TService), serviceTypes,
                                                                           nameof(serviceTypes));

            var collection = new ContainerControlledCollection <TService>(this.container);

            collection.AppendAll(serviceTypes);

            this.RegisterForVerification(collection);

            return(collection);
        }
        internal static InstanceProducer CreateControlledCollectionProducer <TService>(
            ContainerControlledCollection <TService> collection, Container container)
        {
            Registration registration = CreateControlledCollectionRegistration(collection, container);

            return(new InstanceProducer(typeof(IEnumerable <TService>), registration));
        }
 private void RegisterForVerification <TService>(ContainerControlledCollection <TService> collection)
 {
     // By creating a Producer, Simple Injector will automatically register it as 'external producer',
     // which allows it to be verified. To prevent memory leaks however, this external producer is
     // linked using a WeakReference to allow it to be GCed. To prevent this from happening, while
     // the application keeps referencing the collection, we let the collection reference the producer.
     collection.ParentProducer =
         SingletonLifestyle.CreateControlledCollectionProducer(collection, this.container);
 }
        internal static Registration CreateControlledCollectionRegistration <TService>(
            ContainerControlledCollection <TService> collection, Container container)
        {
            var registration = CreateSingleInstanceRegistration(typeof(IEnumerable <TService>), collection, container);

            registration.IsCollection = true;

            return(registration);
        }
        private ContainerControlledCollection <TService> CreateInternal <TService>(
            IEnumerable <Registration> registrations)
            where TService : class
        {
            Requires.IsNotAnAmbiguousType(typeof(TService), nameof(TService));
            Requires.IsNotNull(registrations, nameof(registrations));

            Requires.DoesNotContainNullValues(registrations, nameof(registrations));
            Requires.AreRegistrationsForThisContainer(this.container, registrations, nameof(registrations));
            Requires.ServiceIsAssignableFromImplementations(typeof(TService), registrations, nameof(registrations),
                                                            typeCanBeServiceType: true);
            Requires.OpenGenericTypesDoNotContainUnresolvableTypeArguments(typeof(TService), registrations,
                                                                           nameof(registrations));

            var collection = new ContainerControlledCollection <TService>(this.container);

            collection.AppendAll(registrations);

            this.RegisterForVerification(collection);

            return(collection);
        }