예제 #1
0
        /// <summary>
        /// Utility method resolves the type and logs and returns success.
        /// </summary>
        private static bool tryResolve(
            Type targetType,
            out object result,
            ServiceConstructorRequest request,
            IServiceRegistrationProvider serviceProvider,
            Func <Type, object> instanceProvider,
            bool logMustResolve)
        {
            bool CheckResult(object service, string sourceName, out object successResult)
            {
                if (targetType.IsInstanceOfType(service))
                {
                    request.TraceStack.Add($"{sourceName} resolved '{targetType.GetFriendlyFullName()}'.");
                    successResult = service;
                    return(true);
                }
                successResult = null;
                return(false);
            }

            if (instanceProvider != null)
            {
                if (CheckResult(instanceProvider(targetType), "InstanceProvider Func", out result))
                {
                    return(true);
                }
            }
            if (CheckResult(serviceProvider.GetService(targetType, request), nameof(IServiceProvider), out result))
            {
                return(true);
            }
            if (serviceProvider.ParentServiceProvider
                is IServiceRegistrationProvider parentServiceRegistrationProvider)
            {
                if (CheckResult(
                        parentServiceRegistrationProvider.GetService(targetType, request),
                        nameof(IServiceRegistrationProvider.ParentServiceProvider),
                        out result))
                {
                    return(true);
                }
            }
            else
            {
                if (CheckResult(
                        serviceProvider.ParentServiceProvider?.GetService(targetType),
                        nameof(IServiceRegistrationProvider.ParentServiceProvider),
                        out result))
                {
                    return(true);
                }
            }
            if (logMustResolve)
            {
                request.TraceStack.Add($"Did not resolve '{targetType.GetFriendlyFullName()}'.");
            }
            return(false);
        }
예제 #2
0
 private object tryGetService(Type serviceType, ServiceConstructorRequest serviceConstructorRequest)
 {
     if (serviceType == null)
     {
         throw new ArgumentNullException(nameof(serviceType));
     }
     lock (registrations) {
         if (serviceConstructorRequest == null)
         {
             serviceConstructorRequest = newServiceConstructorRequest();
         }
         return(registrations.TryGetValue(serviceType, out ServiceRegistration registration)
                                         ? registration.Get(serviceConstructorRequest)
                                         : parentServiceRegistrationProvider != null
                                                         ? parentServiceRegistrationProvider.GetService(serviceType, serviceConstructorRequest)
                                                         : parentServiceProvider?.GetService(serviceType));
     }
 }
예제 #3
0
        private object tryGetService(
            Type serviceType,
            ServiceConstructorRequest serviceConstructorRequest)
        {
            if (serviceType == null)
            {
                throw new ArgumentNullException(nameof(serviceType));
            }
            object service = serviceProvider.GetService(serviceType);

            return(serviceType.IsInstanceOfType(service)
                                        ? service
                                        : parentServiceRegistrationProvider != null
                                                        ? parentServiceRegistrationProvider.GetService(
                       serviceType,
                       serviceConstructorRequest
                       ?? new ServiceConstructorRequest(
                           TraceSources.For <ServiceRegistrationProviderWrapper>()))
                                                        : ParentServiceProvider?.GetService(serviceType));
        }