// Flagging the registration with WrapsInstanceCreationDelegate prevents false diagnostic warnings.
 private InstanceProducer(Type serviceType, Expression expression, Container container)
     : this(serviceType,
            new ExpressionRegistration(expression, container) { WrapsInstanceCreationDelegate = true })
 {
     // Overrides earlier set value. This prevents ExpressionBuilt from being applied.
     this.lazyExpression = Helpers.ToLazy(expression);
 }
        private InstanceProducer TryGetProducerFromUnregisteredTypeResolutionCacheOrAdd(
            UnregisteredTypeEventArgs e)
        {
            lock (this.resolveUnregisteredTypeRegistrations)
            {
                if (this.resolveUnregisteredTypeRegistrations.ContainsKey(e.UnregisteredServiceType))
                {
                    // This line will only get hit, in case a different thread came here first.
                    return(this.resolveUnregisteredTypeRegistrations[e.UnregisteredServiceType].Value);
                }

                var registration = e.Registration ?? new ExpressionRegistration(e.Expression, this);

                // By creating the InstanceProducer after checking the dictionary, we prevent the producer
                // from being created twice when multiple threads are running. Having the same duplicate
                // producer can cause a torn lifestyle warning in the container.
                var producer = new InstanceProducer(e.UnregisteredServiceType, registration);

                this.resolveUnregisteredTypeRegistrations[e.UnregisteredServiceType] =
                    Helpers.ToLazy(producer);

                return(producer);
            }
        }