Example #1
0
        public object Resolve(Type serviceType)
        {
            var genericArguments = _emptyTypeArray;
            var typeInfo         = serviceType.GetTypeInfo();

            if (typeInfo.IsGenericType &&
                !_registrations.ContainsKey(serviceType) &&
                typeInfo.GetGenericTypeDefinition() != typeof(IEnumerable <>))
            {
                genericArguments = typeInfo.GetGenericArguments();
                serviceType      = typeInfo.GetGenericTypeDefinition();
                typeInfo         = serviceType.GetTypeInfo();
            }

            IRegistration registration;

            if (!_registrations.TryGetValue(serviceType, out var registrations))
            {
                if (serviceType == typeof(IResolver))
                {
                    return(this);
                }

                if (serviceType == typeof(IScopeResolver))
                {
                    return(new EventFlowIoCResolver(_singletons, _registrations, false));
                }

                if (typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    registration = EnumerableResolvers.GetOrAdd(serviceType, t => new EnumerableResolver(t));
                    return(Create(registration));
                }

                throw new Exception($"Type {serviceType.PrettyPrint()} is not registered");
            }

            registration = registrations.First();
            return(Create(registration, genericArguments));
        }
Example #2
0
        public object Resolve(Type serviceType)
        {
            List <Registration> registrations;
            var genericArguments = _emptyTypeArray;
            var typeInfo         = serviceType.GetTypeInfo();

            if (typeInfo.IsGenericType &&
                !_registrations.ContainsKey(serviceType) &&
                typeInfo.GetGenericTypeDefinition() != typeof(IEnumerable <>))
            {
                genericArguments = typeInfo.GetGenericArguments();
                serviceType      = typeInfo.GetGenericTypeDefinition();
                typeInfo         = serviceType.GetTypeInfo();
            }

            if (!_registrations.TryGetValue(serviceType, out registrations))
            {
                if (serviceType == typeof(IResolver))
                {
                    return(this);
                }

                if (serviceType == typeof(IScopeResolver))
                {
                    return(BeginScope());
                }

                if (typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    return(EnumerableResolvers
                           .GetOrAdd(serviceType, t => new EnumerableResolver(t))
                           .Create(_resolverContext));
                }

                throw new Exception($"Type {serviceType.PrettyPrint()} is not registered");
            }

            return(registrations.First().Create(_resolverContext, genericArguments));
        }