/// <summary>
        /// Initializes a new instance of the <see cref="T:CSF.FlexDi.Resolution.Proxies.UnregisteredServiceResolverProxy"/> class.
        /// </summary>
        /// <param name="proxiedResolver">Proxied resolver.</param>
        /// <param name="registrationResolver">Registration resolver.</param>
        /// <param name="unregisteredRegistrationProvider">Unregistered registration provider.</param>
        /// <param name="cache">The service cache.</param>
        /// <param name="registry">The service registry</param>
        public UnregisteredServiceResolverProxy(IResolver proxiedResolver,
                                                IResolvesRegistrations registrationResolver,
                                                IServiceRegistrationProvider unregisteredRegistrationProvider,
                                                ICachesResolvedServiceInstances cache,
                                                IRegistersServices registry)
            : base(proxiedResolver)
        {
            if (registry == null)
            {
                throw new ArgumentNullException(nameof(registry));
            }
            if (unregisteredRegistrationProvider == null)
            {
                throw new ArgumentNullException(nameof(unregisteredRegistrationProvider));
            }
            if (registrationResolver == null)
            {
                throw new ArgumentNullException(nameof(registrationResolver));
            }

            this.cache = cache;
            this.registrationResolver             = registrationResolver;
            this.unregisteredRegistrationProvider = unregisteredRegistrationProvider;
            this.registry = registry;
        }
Beispiel #2
0
        /// <summary>
        /// Configures a collection of <see cref="T:CSF.FlexDi.Resolution.Proxies.ICreatesProxyingResolver" />.  This method should add any number of
        /// such factories to the <paramref name="factories" /> collection.  These will be added, in order, to the 'stack'
        /// of proxies in which to wrap created resolvers.
        /// </summary>
        /// <param name="factories">The resolver proxy factories to use.</param>
        /// <param name="isInnermostResolver">If set to <c>true</c> is innermost resolver.</param>
        /// <param name="coreResolver">The core resolver.</param>
        protected override void ConfigureResolverProxyFactories(IList <ICreatesProxyingResolver> factories,
                                                                bool isInnermostResolver,
                                                                IResolvesRegistrations coreResolver)
        {
            base.ConfigureResolverProxyFactories(factories, isInnermostResolver, coreResolver);

            factories.Add(new DynamicRecursionResolverProxyFactory());
        }
Beispiel #3
0
        /// <summary>
        /// Initializes a new instance of the
        /// <see cref="T:CSF.FlexDi.Resolution.Proxies.UnregisteredServiceResolverProxyFactory"/> class.
        /// </summary>
        /// <param name="registrationResolver">Registration resolver.</param>
        /// <param name="unregisteredRegistrationProvider">Unregistered registration provider.</param>
        public UnregisteredServiceResolverProxyFactory(IResolvesRegistrations registrationResolver,
                                                       IServiceRegistrationProvider unregisteredRegistrationProvider = null)
        {
            if (registrationResolver == null)
            {
                throw new ArgumentNullException(nameof(registrationResolver));
            }

            this.registrationResolver             = registrationResolver;
            this.unregisteredRegistrationProvider = unregisteredRegistrationProvider;
        }
Beispiel #4
0
        /// <summary>
        /// Configures a collection of <see cref="T:CSF.FlexDi.Resolution.Proxies.ICreatesProxyingResolver" />.  This method should add any number of
        /// such factories to the <paramref name="factories" /> collection.  These will be added, in order, to the 'stack'
        /// of proxies in which to wrap created resolvers.
        /// </summary>
        /// <param name="factories">The resolver proxy factories to use.</param>
        /// <param name="isInnermostResolver">If set to <c>true</c> is innermost resolver.</param>
        /// <param name="coreResolver">The core resolver.</param>
        protected override void ConfigureResolverProxyFactories(IList <ICreatesProxyingResolver> factories,
                                                                bool isInnermostResolver,
                                                                IResolvesRegistrations coreResolver)
        {
            factories.Add(new CachingResolverProxyFactory());
            factories.Add(new FallbackToParentResolverProxyFactory(r => CreateResolver(r, false)));

            // Only the innermost resolver (the most deeply nested) can resolve unregistered services
            if (isInnermostResolver)
            {
                factories.Add(new UnregisteredServiceResolverProxyFactory(coreResolver));
            }

            factories.Add(new CircularDependencyPreventingResolverProxyFactory());
            factories.Add(new LazyInstanceResolverProxyFactory());
            factories.Add(new RegisteredNameInjectingResolverProxyFactory());
            factories.Add(new NamedInstanceDictionaryResolverProxyFactory());
            factories.Add(new OptionalResolutionResolverProxyFactory());
            factories.Add(new DynamicRecursionResolverProxyFactory());
        }
        public void Resolve_resolves_unregistered_service_when_resolution_is_unsuccesful([Frozen, ResolvesToFailure] IResolver proxiedResolver,
                                                                                         [Frozen] IResolvesRegistrations registrationResolver,
                                                                                         [Frozen] IServiceRegistrationProvider unregisteredRegistrationProvider,
                                                                                         UnregisteredServiceResolverProxy sut,
                                                                                         ResolutionPath path,
                                                                                         ResolutionRequest request,
                                                                                         ResolutionResult resolutionResult,
                                                                                         IServiceRegistration registration)
        {
            // Arrange
            Mock.Get(proxiedResolver)
            .Setup(x => x.Resolve(request))
            .Returns(ResolutionResult.Failure(path));
            Mock.Get(unregisteredRegistrationProvider)
            .Setup(x => x.Get(request))
            .Returns(registration);
            Mock.Get(registrationResolver)
            .Setup(x => x.Resolve(request, registration))
            .Returns(resolutionResult);

            // Act
            var result = sut.Resolve(request);

            // Assert
            Assert.That(result, Is.SameAs(resolutionResult));
        }
Beispiel #6
0
 /// <summary>
 /// Configures a collection of <see cref="ICreatesProxyingResolver"/>.  This method should add any number of
 /// such factories to the <paramref name="factories"/> collection.  These will be added, in order, to the 'stack'
 /// of proxies in which to wrap created resolvers.
 /// </summary>
 /// <param name="factories">The resolver proxy factories to use.</param>
 /// <param name="isInnermostResolver">If set to <c>true</c> is innermost resolver.</param>
 /// <param name="coreResolver">The core resolver.</param>
 protected abstract void ConfigureResolverProxyFactories(IList <ICreatesProxyingResolver> factories,
                                                         bool isInnermostResolver,
                                                         IResolvesRegistrations coreResolver);