示例#1
0
        private static IEnumerable<InstanceProducer> GetSelfAndDependentProducers(InstanceProducer producer,
            HashSet<InstanceProducer> set = null)
        {
            set = set ?? new HashSet<InstanceProducer>(ReferenceEqualityComparer<InstanceProducer>.Instance);

            // Prevent stack overflow exception in case the graph is cyclic.
            if (set.Contains(producer))
            {
                yield break;
            }

            // Return self
            yield return set.AddReturn(producer);

            // Return dependent producers
            foreach (var relationship in producer.GetRelationships())
            {
                yield return set.AddReturn(relationship.Dependency);

                foreach (var dependentProducer in GetSelfAndDependentProducers(relationship.Dependency, set))
                {
                    yield return set.AddReturn(dependentProducer);
                }
            }
        }
 internal DisposableTransientComponentDiagnosticResult(Type serviceType, InstanceProducer registration, 
     string description)
     : base(serviceType, description, DiagnosticType.DisposableTransientComponent,
         DiagnosticSeverity.Warning, registration)
 {
     this.Registration = registration;
 }
        private void ThrowWhenProviderToRegisterOverlapsWithExistingProvider(
            InstanceProducer producerToRegister)
        {
            // A provider is a superset of the providerToRegister when it can be applied to ALL generic
            // types that the providerToRegister can be applied to as well.
            var overlappingProducers =
                from producer in this.CurrentProducers
                where producer.ImplementationType != null
                where !producer.Registration.WrapsInstanceCreationDelegate
                where !producerToRegister.Registration.WrapsInstanceCreationDelegate
                where producer.ImplementationType == producerToRegister.ImplementationType
                select producer;

            if (overlappingProducers.Any())
            {
                var overlappingProducer = overlappingProducers.FirstOrDefault();

                throw new InvalidOperationException(
                    StringResources.AnOverlappingGenericRegistrationExists(
                        producerToRegister.ServiceType,
                        overlappingProducer.ImplementationType,
                        overlappingProducer.IsConditional,
                        producerToRegister.ImplementationType,
                        producerToRegister.IsConditional));
            }
        }
 internal ServiceTypeDecoratorInfo(Type registeredServiceType, Type implementationType,
     InstanceProducer originalProducer)
 {
     this.registeredServiceType = registeredServiceType;
     this.ImplementationType = implementationType;
     this.OriginalProducer = originalProducer;
 }
        private static string BuildDescription(InstanceProducer registration, KnownRelationship[] relationships)
        {
            string componentName = BuildComponentName(registration, relationships);
            string unregisteredTypeName = BuildUnregisteredTypeDescription(relationships);

            return componentName + " depends on " + unregisteredTypeName + ".";
        }
 private static DebuggerViewItem[] GetDebugValue(Type implementationType, InstanceProducer[] dependencies)
 {
     return new[]
     {
         new DebuggerViewItem("ImplementationType", implementationType.ToFriendlyName(), implementationType),
         new DebuggerViewItem("Dependencies", dependencies.Length + " dependencies.", dependencies),
     };
 }
 private static ContainerRegisteredServiceDiagnosticResult BuildDiagnosticResult(
     InstanceProducer registration, KnownRelationship[] relationships)
 {
     return new ContainerRegisteredServiceDiagnosticResult(
         serviceType: registration.ServiceType,
         description: BuildDescription(registration, relationships),
         relationships: relationships);
 }
        internal InitializationContext(InstanceProducer producer, Registration registration)
        {
            // producer will be null when a user calls Registration.BuildExpression() directly, instead of
            // calling InstanceProducer.BuildExpression() or InstanceProducer.GetInstance(). 
            Requires.IsNotNull(registration, nameof(registration));

            this.Producer = producer;
            this.Registration = registration;
        }
 internal TornLifestyleDiagnosticResult(Type serviceType, string description, Lifestyle lifestyle,
     Type implementationType, InstanceProducer[] affectedRegistrations)
     : base(serviceType, description, DiagnosticType.TornLifestyle, DiagnosticSeverity.Warning,
         CreateDebugValue(implementationType, lifestyle, affectedRegistrations))
 {
     this.Lifestyle = lifestyle;
     this.ImplementationType = implementationType;
     this.AffectedRegistrations = new ReadOnlyCollection<InstanceProducer>(affectedRegistrations.ToList());
 }
 internal ShortCircuitedDependencyDiagnosticResult(Type serviceType, string description,
     InstanceProducer registration, KnownRelationship relationship,
     IEnumerable<InstanceProducer> expectedDependencies)
     : base(serviceType, description, DiagnosticType.ShortCircuitedDependency, 
         DiagnosticSeverity.Warning, 
         CreateDebugValue(registration, relationship, expectedDependencies.ToArray()))
 {
     this.Relationship = relationship;
     this.ExpectedDependencies = new ReadOnlyCollection<InstanceProducer>(expectedDependencies.ToList());
 }
        public void Add(InstanceProducer producer)
        {
            this.container.ThrowWhenContainerIsLocked();

            this.ThrowWhenOverlappingRegistrationsExist(producer);

            this.providers.RemoveAll(p => p.ServiceType == producer.ServiceType);

            this.providers.Add(new ClosedToInstanceProducerProvider(producer));
        }
 internal AmbiguousLifestylesDiagnosticResult(Type serviceType, string description, 
     Lifestyle[] lifestyles, Type implementationType, InstanceProducer diagnosedProducer, 
     InstanceProducer[] conflictingProducers)
     : base(serviceType, description, DiagnosticType.AmbiguousLifestyles, DiagnosticSeverity.Warning,
         CreateDebugValue(implementationType, lifestyles, conflictingProducers))
 {
     this.Lifestyles = new ReadOnlyCollection<Lifestyle>(lifestyles.ToList());
     this.ImplementationType = implementationType;
     this.DiagnosedRegistration = diagnosedProducer;
     this.ConflictingRegistrations = new ReadOnlyCollection<InstanceProducer>(conflictingProducers.ToList());
 }
        internal void AddAppliedDecorator(Type decoratorType, Container container, Lifestyle lifestyle, 
            Expression decoratedExpression, IEnumerable<KnownRelationship> decoratorRelationships = null)
        {
            var registration = new ExpressionRegistration(decoratedExpression, decoratorType,
                lifestyle, container);

            registration.ReplaceRelationships(decoratorRelationships ?? Enumerable.Empty<KnownRelationship>());

            var producer = new InstanceProducer(this.registeredServiceType, registration);

            this.appliedDecorators.Add(new DecoratorInfo(decoratorType, producer));
        }
        private static TornLifestyleDiagnosticResult CreateDiagnosticResult(
            InstanceProducer diagnosedProducer,
            InstanceProducer[] affectedProducers)
        {
            Type serviceType = diagnosedProducer.ServiceType;
            Type implementationType = diagnosedProducer.Registration.ImplementationType;
            Lifestyle lifestyle = diagnosedProducer.Registration.Lifestyle;
            string description = BuildDescription(diagnosedProducer, affectedProducers);

            return new TornLifestyleDiagnosticResult(serviceType, description, lifestyle, implementationType,
                affectedProducers);
        }
        public void Add(InstanceProducer producer)
        {
            this.container.ThrowWhenContainerIsLocked();

            this.ThrowWhenConditionalIsRegisteredInOverridingMode(producer);
            this.ThrowWhenOverlappingRegistrationsExist(producer);

            if (this.container.Options.AllowOverridingRegistrations)
            {
                this.providers.RemoveAll(p => p.ServiceType == producer.ServiceType);
            }

            this.providers.Add(new ClosedToInstanceProducerProvider(producer));
        }
            public void Add(InstanceProducer producer)
            {
                this.container.ThrowWhenContainerIsLocked();
                this.ThrowWhenConditionalAndUnconditionalAreMixed(producer);

                this.ThrowWhenTypeAlreadyRegistered(producer);

                if (producer.IsUnconditional)
                {
                    this.producers.Clear();
                }

                this.producers.Add(producer);
            }
        private static bool IsAnalyzable(InstanceProducer producer)
        {
            // We can't analyze collections, because this would lead to false positives when decorators are
            // applied to the collection. For a decorator, each collection element it decorates is a 
            // dependency, which will make it look as if the decorator has too many dependencies. Since the
            // container will delegate the creation of those elements back to the container, those elements
            // would by them selves still get analyzed, so the only thing we'd miss here is the decorator.
            if (!producer.ServiceType.Info().IsGenericType)
            {
                return true;
            }

            return producer.ServiceType.GetGenericTypeDefinition() != typeof(IEnumerable<>);
        }
        internal OverriddenParameter(ParameterInfo parameter, Expression expression, InstanceProducer producer)
        {
            this.Parameter = parameter;
            this.Expression = expression;
            this.Producer = producer;

            // A placeholder is a fake expression that we inject into the NewExpression. After the 
            // NewExpression is created, it is ran through the ExpressionBuilding interception. By using
            // placeholders instead of the real overridden expressions we prevent those expressions from
            // being processed twice by the ExpressionBuilding event (since we expect the supplied expressions
            // to already be processed). After the event has ran we replace the placeholders with the real
            // expressions again (using an ExpressionVisitor).
            this.PlaceHolder = System.Linq.Expressions.Expression.Constant(null, parameter.ParameterType);
        }
        public void Add(InstanceProducer producer)
        {
            this.container.ThrowWhenContainerIsLocked();
            this.ThrowWhenConditionalAndUnconditionalAreMixed(producer);

            this.ThrowWhenTypeAlreadyRegistered(producer);
            this.ThrowWhenProviderToRegisterOverlapsWithExistingProvider(producer);

            if (producer.IsUnconditional)
            {
                this.providers.Clear();
            }

            this.providers.Add(new SingleInstanceProducerProvider(producer));
        }
        public void Add(InstanceProducer producer)
        {
            this.container.ThrowWhenContainerIsLocked();
            this.ThrowWhenConditionalAndUnconditionalAreMixed(producer);
            this.ThrowWhenConditionalIsRegisteredInOverridingMode(producer);

            this.ThrowWhenTypeAlreadyRegistered(producer);
            this.ThrowWhenIdenticalImplementationIsAlreadyRegistered(producer);

            if (producer.IsUnconditional)
            {
                this.providers.Clear();
            }

            this.providers.Add(new SingleInstanceProducerProvider(producer));
        }
示例#21
0
        internal static IRegistrationEntry Create(InstanceProducer producer)
        {
            if (producer.ServiceType.IsGenericType)
            {
                var entry = new GenericRegistrationEntry(
                    producer.ServiceType.GetGenericTypeDefinition(),
                    producer.Registration.Container);

                entry.Add(producer);

                return entry;
            }
            else
            {
                return new NonGenericRegistrationEntry(producer);
            }
        }
 private static DebuggerViewItem[] CreateDebugValue(Type implementationType, Lifestyle lifestyle,
     InstanceProducer[] affectedRegistrations)
 {
     return new[]
     {
         new DebuggerViewItem(
             name: "ImplementationType", 
             description: implementationType.ToFriendlyName(), 
             value: implementationType),
         new DebuggerViewItem(
             name: "Lifestyle", 
             description: lifestyle.Name, 
             value: lifestyle),
         new DebuggerViewItem(
             name: "Affected Registrations", 
             description: ToCommaSeparatedText(affectedRegistrations), 
             value: affectedRegistrations)
     };
 }
 private static DebuggerViewItem[] CreateDebugValue(Type implementationType, Lifestyle[] lifestyles,
     InstanceProducer[] conflictingRegistrations)
 {
     return new[]
     {
         new DebuggerViewItem(
             name: "ImplementationType", 
             description: implementationType.ToFriendlyName(), 
             value: implementationType),
         new DebuggerViewItem(
             name: "Lifestyles", 
             description: ToCommaSeparatedText(lifestyles), 
             value: lifestyles),
         new DebuggerViewItem(
             name: "Conflicting Registrations", 
             description: ToCommaSeparatedText(conflictingRegistrations), 
             value: conflictingRegistrations)
     };
 }
 private static DebuggerViewItem[] CreateDebugValue(InstanceProducer registration,
     KnownRelationship actualDependency, 
     InstanceProducer[] possibleSkippedRegistrations)
 {
     return new[]
     {
         new DebuggerViewItem(
             name: "Registration", 
             description: registration.ServiceType.ToFriendlyName(), 
             value: registration),
         new DebuggerViewItem(
             name: "Actual Dependency", 
             description: actualDependency.Dependency.ServiceType.ToFriendlyName(), 
             value: actualDependency),
         new DebuggerViewItem(
             name: "Expected Dependency", 
             description: possibleSkippedRegistrations.First().ServiceType.ToFriendlyName(),
             value: possibleSkippedRegistrations.Length == 1 ? 
                 (object)possibleSkippedRegistrations[0] : 
                 possibleSkippedRegistrations),
     };
 }
示例#25
0
        /// <summary>
        /// Allows the resolving function factories.
        /// </summary>
        /// <param name="options">The options.</param>
        public static void AllowResolvingFuncFactories(this ContainerOptions options)
        {
            options.Container.ResolveUnregisteredType += (s, e) => {
                var type = e.UnregisteredServiceType;

                if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(Func <>))
                {
                    return;
                }

                Type serviceType = type.GetGenericArguments().First();

                InstanceProducer registration =
                    options.Container.GetRegistration(serviceType, true);

                Type funcType = typeof(Func <>).MakeGenericType(serviceType);

                var factoryDelegate = Expression.Lambda(funcType,
                                                        registration.BuildExpression()).Compile();

                e.Register(Expression.Constant(factoryDelegate));
            };
        }
示例#26
0
            InstanceProducer IDependencyInjectionBehavior.GetInstanceProducer(
                InjectionConsumerInfo consumer, bool throwOnFailure)
            {
                ThreadLocal <object> local = this.FindThreadLocal(consumer.Target);

                if (local != null)
                {
                    if (consumer.Target.TargetType.IsValueType && this.container.IsVerifying())
                    {
                        throw new InvalidOperationException(
                                  "You can't use Verify() if the factory product contains value types.");
                    }

                    return(InstanceProducer.FromExpression(
                               consumer.Target.TargetType,
                               Expression.Convert(
                                   Expression.Property(Expression.Constant(local), "Value"),
                                   consumer.Target.TargetType),
                               this.container));
                }

                return(this.originalBehavior.GetInstanceProducer(consumer, throwOnFailure));
            }
示例#27
0
        private OverriddenParameter[] CreateOverriddenParameters(
            Type serviceType,
            ConstructorInfo decoratorConstructor,
            Expression decorateeExpression,
            InstanceProducer realProducer,
            ServiceTypeDecoratorInfo info)
        {
            ParameterInfo decorateeParameter = GetDecorateeParameter(serviceType, decoratorConstructor);

            decorateeExpression = this.GetExpressionForDecorateeDependencyParameterOrNull(
                decorateeParameter, serviceType, decorateeExpression);

            var currentProducer = info.GetCurrentInstanceProducer();

            if (DecoratorHelpers.IsDecorateeFactoryDependencyType(decorateeParameter.ParameterType, serviceType))
            {
                // Adding a verifier makes sure the graph for the decoratee gets created,
                // which allows testing whether constructing the graph fails.
                AddVerifierForDecorateeFactoryDependency(decorateeExpression, realProducer);

                // By adding the decoratee producer, we allow that object graph to be diagnosed.
                realProducer.AddProducerToVerify(currentProducer);

                currentProducer = this.CreateDecorateeFactoryProducer(decorateeParameter);
            }

            var decorateeOverriddenParameter =
                new OverriddenParameter(decorateeParameter, decorateeExpression, currentProducer);

            IEnumerable <OverriddenParameter> predicateContextOverriddenParameters =
                this.CreateOverriddenDecoratorContextParameters(decoratorConstructor, currentProducer);

            var overriddenParameters = (new[] { decorateeOverriddenParameter })
                                       .Concat(predicateContextOverriddenParameters);

            return(overriddenParameters.ToArray());
        }
示例#28
0
        private void ThrowWhenOverlappingRegistrationsExist(InstanceProducer producerToRegister)
        {
            if (!this.container.Options.AllowOverridingRegistrations)
            {
                var overlappingProviders =
                    from provider in this.providers
                    where provider.OverlapsWith(producerToRegister)
                    select provider;

                if (overlappingProviders.Any())
                {
                    var overlappingProvider = overlappingProviders.First();

                    if (overlappingProvider.ServiceType.IsGenericTypeDefinition())
                    {
                        // An overlapping provider will always have an ImplementationType, because providers
                        // with a factory will never be overlapping.
                        Type implementationType = overlappingProvider.ImplementationType !;

                        throw new InvalidOperationException(
                                  StringResources.RegistrationForClosedServiceTypeOverlapsWithOpenGenericRegistration(
                                      producerToRegister.ServiceType,
                                      implementationType));
                    }

                    bool eitherOneRegistrationIsConditional =
                        overlappingProvider.IsConditional != producerToRegister.IsConditional;

                    throw eitherOneRegistrationIsConditional
                        ? GetAnOverlappingGenericRegistrationExistsException(
                              new ClosedToInstanceProducerProvider(producerToRegister),
                              overlappingProvider)
                        : new InvalidOperationException(
                              StringResources.TypeAlreadyRegistered(producerToRegister.ServiceType));
                }
            }
        }
示例#29
0
        private static IEnumerable <InstanceProducer> GetSelfAndDependentProducers(InstanceProducer producer,
                                                                                   HashSet <InstanceProducer> set)
        {
            // Prevent stack overflow exception in case the graph is cyclic.
            if (set.Contains(producer))
            {
                yield break;
            }

            // Return self
            yield return(set.AddReturn(producer));

            // Return dependent producers
            foreach (var relationship in producer.GetRelationships())
            {
                if (relationship.UseForVerification)
                {
                    foreach (var dependentProducer in GetSelfAndDependentProducers(relationship.Dependency, set))
                    {
                        yield return(set.AddReturn(dependentProducer));
                    }
                }
            }
        }
示例#30
0
        private InstanceProducer GetInstanceProducerFor(ParameterInfo parameter)
        {
            InstanceProducer producer = null;

            Container container = this.getContainer();

            if (container == null)
            {
                throw new InvalidOperationException(
                          StringResources.CanNotCallBuildParameterExpressionContainerOptionsNotPartOfContainer());
            }

            producer = container.GetRegistrationEvenIfInvalid(parameter.ParameterType);

            if (producer == null)
            {
                container.Options.ConstructorVerificationBehavior.Verify(parameter);

                throw new ActivationException(StringResources.ParameterTypeMustBeRegistered(
                                                  parameter.Member.DeclaringType, parameter));
            }

            return(producer);
        }
示例#31
0
        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.container);

                // 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);
            }
        }
示例#32
0
        public void AddRegistration(Type serviceType, Registration registration, string name)
        {
            if (this.IsLocked())
            {
                throw new InvalidOperationException("The container is locked.");
            }

            Dictionary <string, InstanceProducer> dict;

            if (!this.namedProducers.TryGetValue(serviceType, out dict))
            {
                dict = new Dictionary <string, InstanceProducer>();
                this.namedProducers[serviceType] = dict;
            }

            if (this.Options.AllowOverridingRegistrations)
            {
                dict[name] = new InstanceProducer(serviceType, registration);
            }
            else
            {
                dict.Add(name, new InstanceProducer(serviceType, registration));
            }
        }
示例#33
0
        private static void BuildDependencies(Container container, InstanceProducer producer, List <DependencyInfo> acc, HashSet <InstanceProducer> visited)
        {
            if (visited.Contains(producer))
            {
                return;
            }

            visited.Add(producer);
            foreach (var rel in producer.GetRelationships())
            {
                var child = rel.Dependency.Registration.ImplementationType;
                if (child.IsArray)
                {
                    var interfaceType = child.GetElementType();
                    foreach (var dep in container.GetAllInstances(interfaceType))
                    {
                        acc.Add(new DependencyInfo(producer.ServiceType, dep.GetType(), interfaceType));
                        BuildDependencies(container, dep.GetType(), acc, visited);
                    }
                }
                else if (child.IsGenericType && child.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    var interfaceType = child.GetGenericArguments()[0];
                    foreach (var dep in container.GetAllInstances(interfaceType))
                    {
                        acc.Add(new DependencyInfo(producer.ServiceType, dep.GetType(), interfaceType));
                        BuildDependencies(container, dep.GetType(), acc, visited);
                    }
                }
                else
                {
                    acc.Add(new DependencyInfo(producer.Registration.ImplementationType, rel.Dependency.Registration.ImplementationType, rel.Dependency.ServiceType));
                    BuildDependencies(container, rel.Dependency, acc, visited);
                }
            }
        }
        private static string BuildDescription(InstanceProducer diagnosedProducer,
                                               InstanceProducer[] affectedProducers)
        {
            Lifestyle lifestyle = diagnosedProducer.Registration.Lifestyle;

            var tornProducers = (
                from producer in affectedProducers
                where producer.Registration != diagnosedProducer.Registration
                select producer)
                                .ToArray();

            return(string.Format(CultureInfo.InvariantCulture,
                                 "The registration for {0} maps to the same implementation and lifestyle as the {1} " +
                                 "for {2} {3}. They {4} map to {5} ({6}). This will cause each registration to resolve to " +
                                 "a different instance: each registration will have its own instance{7}.",
                                 diagnosedProducer.ServiceType.ToFriendlyName(),
                                 tornProducers.Length == 1 ? "registration" : "registrations",
                                 tornProducers.Select(producer => producer.ServiceType.ToFriendlyName()).ToCommaSeparatedText(),
                                 tornProducers.Length == 1 ? "does" : "do",
                                 tornProducers.Length == 1 ? "both" : "all",
                                 diagnosedProducer.Registration.ImplementationType.ToFriendlyName(),
                                 lifestyle.Name,
                                 lifestyle == Lifestyle.Singleton ? string.Empty : " during a single " + lifestyle.Name));
        }
 private static DebuggerViewItem BuildNonGenericGroup(Type closedType,
     InstanceProducer[] producersForGroup)
 {
     return new DebuggerViewItem(
         name: Helpers.ToFriendlyName(closedType),
         description: "Count = " + producersForGroup.Length,
         value: producersForGroup.ToArray());
 }
        private object BuildGenericGroup(Type groupType, 
            InstanceProducer[] producersForGroup, int level)
        {
            object[] childGroups = this.GroupProducers(producersForGroup, level);

            if (childGroups.Length == 1)
            {
                // This flattens the hierarchy when there is just one item in the group.
                return childGroups[0];
            }

            return new DebuggerViewItem(
                name: Helpers.ToFriendlyName(groupType),
                description: "Count = " + producersForGroup.Length,
                value: childGroups);
        }
        private object BuildProducerGroup(Type groupType, 
            InstanceProducer[] producersForGroup, int level)
        {
            if (producersForGroup.Length == 1)
            {
                var producer = producersForGroup[0];

                // This flattens the hierarchy when there is just one item in the group.
                return new DebuggerViewItem(
                    name: Helpers.ToFriendlyName(producer.ServiceType),
                    description: producer.DebuggerDisplay,
                    value: producersForGroup[0]);
            }

            if (groupType.ContainsGenericParameters)
            {
                return this.BuildGenericGroup(groupType, producersForGroup, level);
            }
            else
            {
                return BuildNonGenericGroup(groupType, producersForGroup);
            }
        }
示例#38
0
 private IEnumerable <OverriddenParameter> CreateOverriddenDecoratorContextParameters(
     InstanceProducer currentProducer) =>
 from parameter in this.decoratorConstructor !.GetParameters()
 internal static bool IsContainerControlledCollection(this InstanceProducer producer) =>
 IsContainerControlledCollection(producer.Registration);
 internal CyclicDependencyValidator(InstanceProducer producer)
 {
     this.producer = producer;
 }
 internal DisposableTransientComponentDiagnosticResult(Type serviceType, InstanceProducer registration,
                                                       string description)
     : base(serviceType, description, DiagnosticType.DisposableTransientComponent, registration)
 {
 }
示例#42
0
 internal AmbiguousLifestylesDiagnosticResult(Type serviceType, string description,
                                              Lifestyle[] lifestyles, Type implementationType, InstanceProducer diagnosedProducer,
                                              InstanceProducer[] conflictingProducers)
     : base(serviceType, description, DiagnosticType.AmbiguousLifestyles,
            CreateDebugValue(implementationType, lifestyles, conflictingProducers))
 {
     this.Lifestyles               = new ReadOnlyCollection <Lifestyle>(lifestyles.ToList());
     this.ImplementationType       = implementationType;
     this.DiagnosedRegistration    = diagnosedProducer;
     this.ConflictingRegistrations = new ReadOnlyCollection <InstanceProducer>(conflictingProducers.ToList());
 }
 public FoundInstanceProducer(Type serviceType, Type implementationType, InstanceProducer producer)
 {
     this.ServiceType        = serviceType;
     this.ImplementationType = implementationType;
     this.Producer           = producer;
 }
示例#44
0
 public bool OverlapsWith(InstanceProducer producerToCheck) =>
 this.IsConditional || this.ImplementationType == null
         ? false // Conditionals never overlap compile time.
         : GenericTypeBuilder.IsImplementationApplicableToEveryGenericType(
     producerToCheck.ServiceType,
     this.ImplementationType);
示例#45
0
 public bool OverlapsWith(InstanceProducer producerToCheck) =>
 (this.producer.IsUnconditional || producerToCheck.IsUnconditional) &&
 this.producer.ServiceType == producerToCheck.ServiceType;
 internal static Type GetContainerControlledCollectionElementType(this InstanceProducer producer) =>
 ((ContainerControlledCollectionRegistration)producer.Registration).ElementType;
示例#47
0
 internal DecoratorInfo(Type decoratorType, InstanceProducer decoratorProducer)
 {
     this.DecoratorType     = decoratorType;
     this.DecoratorProducer = decoratorProducer;
 }
 internal ServiceTypeDecoratorInfo(Type implementationType, InstanceProducer originalProducer)
 {
     this.ImplementationType = implementationType;
     this.OriginalProducer   = originalProducer;
 }
 private static string BuildDescription(InstanceProducer producer) =>
 string.Format(
     CultureInfo.InvariantCulture,
     "{0} is registered as transient, but implements IDisposable.",
     producer.Registration.ImplementationType.ToFriendlyName());
示例#50
0
 internal override void RegisterUncontrolledCollection(Type serviceType, InstanceProducer producer)
 {
     this.AddRegistrationGroup(RegistrationGroup.CreateForUncontrolledProducer(serviceType, producer));
 }
示例#51
0
 internal abstract void RegisterUncontrolledCollection(Type serviceType, InstanceProducer producer);
 private static string ToFriendlyNameWithLifestyle(InstanceProducer producer) =>
 producer.ServiceType.FriendlyName() + " (" + producer.Registration.Lifestyle.Name + ")";
 private void ThrowWhenConditionalAndUnconditionalAreMixed(InstanceProducer producer)
 {
     this.ThrowWhenNonGenericTypeAlreadyRegisteredAsUnconditionalRegistration(producer);
     this.ThrowWhenNonGenericTypeAlreadyRegisteredAsConditionalRegistration(producer);
 }
示例#54
0
 public SingleInstanceProducerProvider(InstanceProducer producer) => this.producer = producer;
        private void ThrowWhenOverlappingRegistrationsExist(InstanceProducer producer)
        {
            if (!this.container.Options.AllowOverridingRegistrations)
            {
                var overlappingProviders =
                    from provider in this.providers
                    where provider.OverlapsWith(producer.ServiceType)
                    select provider;

                if (overlappingProviders.Any())
                {
                    var overlappingProvider = overlappingProviders.First();

                    if (overlappingProvider.ServiceType.IsGenericTypeDefinition)
                    {
                        throw new InvalidOperationException(
                            StringResources.RegistrationForClosedServiceTypeOverlapsWithOpenGenericRegistration(
                                producer.ServiceType,
                                overlappingProvider.ImplementationType));
                    }

                    throw new InvalidOperationException(StringResources.TypeAlreadyRegistered(producer.ServiceType));
                }
            }
        }
 internal override void RegisterUncontrolledCollection(Type serviceType, InstanceProducer producer)
 {
     throw new NotSupportedException(
               StringResources.MixingRegistrationsWithControlledAndUncontrolledIsNotSupported(serviceType,
                                                                                              controlled: false));
 }
 private IEnumerable<OverriddenParameter> CreateOverriddenDecoratorContextParameters(
     InstanceProducer currentProducer)
 {
     return
         from parameter in this.decoratorConstructor.GetParameters()
         where parameter.ParameterType == typeof(DecoratorContext)
         let contextExpression = Expression.Constant(new DecoratorContext(this.Context))
         select new OverriddenParameter(parameter, contextExpression, currentProducer);
 }
 public ClosedToInstanceProducerProvider(InstanceProducer producer)
 {
     this.producer = producer;
 }
 public ClosedToInstanceProducerProvider(InstanceProducer producer)
 {
     this.producer = producer;
 }
 private static ContainerRegisteredServiceDiagnosticResult BuildDiagnosticResult(
     InstanceProducer registration, KnownRelationship[] relationships) =>
 new ContainerRegisteredServiceDiagnosticResult(
     serviceType: registration.ServiceType,
     description: BuildDescription(registration, relationships),
     relationships: relationships);