コード例 #1
0
        private static void Validate(ValidationTarget validationTarget, ServiceMap serviceMap, ICollection <ValidationResult> result)
        {
            var registration = GetServiceRegistration(serviceMap, validationTarget);

            if (registration == null)
            {
                if (validationTarget.ServiceType.IsFunc() || validationTarget.ServiceType.IsLazy())
                {
                    var serviceType = validationTarget.ServiceType.GenericTypeArguments[0];
                    var underlyingvalidationTarget = validationTarget.WithServiceDescription(serviceType, string.Empty);
                    registration = GetServiceRegistration(serviceMap, underlyingvalidationTarget);

                    if (registration != null)
                    {
                        return;
                    }

                    if (serviceMap.ContainsAmbiguousRegistrationFor(serviceType))
                    {
                        result.Add(new ValidationResult("", ValidationSeverity.Ambiguous, underlyingvalidationTarget));
                    }
                    else
                    {
                        string message = string.Format(MissingDeferredDependency, validationTarget.ServiceType, underlyingvalidationTarget.ServiceType);
                        result.Add(new ValidationResult(message, ValidationSeverity.MissingDependency, underlyingvalidationTarget));
                    }
                }
                else if (validationTarget.ServiceType.IsGenericType && validationTarget.ServiceType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    var serviceType = validationTarget.ServiceType.GenericTypeArguments[0];
                    var underlyingvalidationTarget = validationTarget.WithServiceDescription(serviceType, string.Empty);
                    var registrations = GetServiceRegistrations(serviceMap, underlyingvalidationTarget);
                    if (registrations.Any())
                    {
                        return;
                    }

                    // strict: there has to be at least 1
                    string message = string.Format(MissingDeferredDependency, validationTarget.ServiceType, underlyingvalidationTarget.ServiceType);
                    result.Add(new ValidationResult(message, ValidationSeverity.MissingDependency, underlyingvalidationTarget));
                }
                else
                {
                    if (serviceMap.ContainsAmbiguousRegistrationFor(validationTarget.ServiceType))
                    {
                        result.Add(new ValidationResult("", ValidationSeverity.Ambiguous, validationTarget));
                    }
                    else
                    {
                        result.Add(new ValidationResult("", ValidationSeverity.MissingDependency, validationTarget));
                    }
                }
            }
            else
            {
                ValidateDisposable(validationTarget, result, registration);
                ValidateLifetime(validationTarget, registration, result);
            }
        }
コード例 #2
0
 private static void ValidateLifetime(ValidationTarget validationTarget, ServiceRegistration dependencyRegistration, ICollection <ValidationResult> result)
 {
     if (GetLifespan(validationTarget.DeclaringService.Lifetime) > GetLifespan(dependencyRegistration.Lifetime))
     {
         var message = string.Format(CaptiveDependency, dependencyRegistration.ServiceType,
                                     validationTarget.DeclaringService.ServiceType, GetLifetimeName(dependencyRegistration.Lifetime),
                                     GetLifetimeName(validationTarget.DeclaringService.Lifetime));
         result.Add(new ValidationResult(message, ValidationSeverity.Captive, validationTarget));
     }
 }
コード例 #3
0
        private static IReadOnlyCollection <ValidationResult> ValidateConstructor(ServiceMap serviceMap,
                                                                                  ServiceRegistration serviceRegistration, ConstructorInfo constructorInfo)
        {
            var result = new Collection <ValidationResult>();

            foreach (var parameter in constructorInfo.GetParameters())
            {
                var validationTarget = new ValidationTarget(serviceRegistration, parameter);
                Validate(validationTarget, serviceMap, result);
            }
            return(result);
        }
コード例 #4
0
        private static void ValidateDisposable(ValidationTarget validationTarget, ICollection <ValidationResult> result,
                                               ServiceRegistration registration)
        {
            if (registration.ServiceType.Implements <IDisposable>())
            {
                var message = string.Format(NotDisposeMessageServiceType, registration.ServiceType,
                                            validationTarget.DeclaringService.ImplementingType);
                result.Add(new ValidationResult(message, ValidationSeverity.NotDisposed, validationTarget));
            }

            else if (registration.ImplementingType != null && registration.ImplementingType.Implements <IDisposable>())
            {
                var message = string.Format(NotDisposeMessageImplementingType, registration.ImplementingType,
                                            registration.ServiceType,
                                            validationTarget.DeclaringService.ImplementingType);
                result.Add(new ValidationResult(message, ValidationSeverity.NotDisposed, validationTarget));
            }
        }
コード例 #5
0
 public ValidationResult(string message, ValidationSeverity severity, ValidationTarget validationTarget)
 {
     Message          = message;
     Severity         = severity;
     ValidationTarget = validationTarget;
 }
コード例 #6
0
        private static ServiceRegistration GetServiceRegistration(ServiceMap serviceMap, ValidationTarget validationTarget)
        {
            if (!serviceMap.TryGetValue(validationTarget.ServiceType, out var registrations))
            {
                return(null);
            }

            if (registrations.TryGetValue(string.Empty, out var registration))
            {
                return(registration);
            }

            if (registrations.Count == 1)
            {
                return(registrations.Values.First());
            }

            if (registrations.TryGetValue(validationTarget.ServiceName, out registration))
            {
                return(registration);
            }

            return(null);
        }
コード例 #7
0
 private static IEnumerable <ServiceRegistration> GetServiceRegistrations(ServiceMap serviceMap, ValidationTarget validationTarget)
 {
     return(serviceMap.Where(x => validationTarget.ServiceType.IsAssignableFrom(x.Key)).SelectMany(x => x.Value.Values));
 }