Represents the default implementation of the IFactoryRequest interface.
Inheritance: IFactoryRequest
Exemplo n.º 1
0
        /// <summary>
        /// Instantiates the service described by the <paramref name="serviceRequest"/>.
        /// </summary>
        /// <param name="serviceRequest">The <see cref="IServiceRequest"/> that describes the service that needs to be instantiated.</param>
        /// <returns>A valid object reference if the service can be found; otherwise, it will return <c>null</c>.</returns>
        public virtual object GetService(IServiceRequest serviceRequest)
        {
            // Allow users to intercept the instantiation process
            if (_preProcessor != null)
                _preProcessor.Preprocess(serviceRequest);

            var factoryRequest = new FactoryRequest
            {
                ServiceType = serviceRequest.ServiceType,
                ServiceName = serviceRequest.ServiceName,
                Arguments = serviceRequest.ActualArguments,
                Container = _container
            };

            var instance = _creator.CreateFrom(factoryRequest, serviceRequest.ActualFactory);

            // Postprocess the results
            var result = new ServiceRequestResult
            {
                ServiceName = serviceRequest.ServiceName,
                ActualResult = instance,
                Container = _container,
                OriginalResult = instance,
                ServiceType = serviceRequest.ServiceType,
                AdditionalArguments = serviceRequest.ActualArguments
            };

            if (_postProcessor != null)
                _postProcessor.PostProcess(result);

            return result.ActualResult ?? result.OriginalResult;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates an object instance.
        /// </summary>
        /// <param name="factory">The target factory.</param>
        /// <param name="serviceType">The requested service type.</param>
        /// <param name="container">The target service contaienr.</param>
        /// <param name="additionalArguments">The additional arguments that will be used to create the service instance.</param>
        /// <returns>A service instance.</returns>
        public static object CreateInstance(this IFactory factory, Type serviceType,
                                            IServiceContainer container, params object[] additionalArguments)
        {
            var request = new FactoryRequest()
            {
                ServiceName = null,
                ServiceType = serviceType,
                Arguments   = additionalArguments
            };

            return(factory.CreateInstance(request));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Creates an object instance.
        /// </summary>
        /// <param name="factory">The target factory.</param>
        /// <param name="serviceType">The requested service type.</param>
        /// <param name="container">The target service contaienr.</param>
        /// <param name="additionalArguments">The additional arguments that will be used to create the service instance.</param>
        /// <returns>A service instance.</returns>
        public static object CreateInstance(this IFactory factory, Type serviceType, 
            IServiceContainer container, params object[] additionalArguments)
        {
            var request = new FactoryRequest()
                              {
                                  ServiceName = null,
                                  ServiceType = serviceType,
                                  Arguments = additionalArguments
                              };

            return factory.CreateInstance(request);
        }
Exemplo n.º 4
0
        public void GenericFactoryAdapterShouldCallUntypedFactoryInstance()
        {
            var container = new ServiceContainer();
            var mockFactory = new Mock<IFactory<ISerializable>>();
            var mockService = new Mock<ISerializable>();
            var adapter = new FactoryAdapter<ISerializable>(mockFactory.Object);

            // The adapter itself should call the container on creation
            mockFactory.Expect(f => f.CreateInstance(It.Is<IFactoryRequest>(request => request.Container == container)))
                .Returns(mockService.Object);

            Assert.IsInstanceOfType(typeof(IFactory), adapter);

            var factoryRequest = new FactoryRequest()
                              {
                                  ServiceName = null,
                                  ServiceType = typeof(ISerializable),
                                  Container = container
                              };

            adapter.CreateInstance(factoryRequest);

            mockFactory.VerifyAll();
        }
Exemplo n.º 5
0
        /// <summary>
        /// Instantiates the service described by the <paramref name="serviceRequest"/>.
        /// </summary>
        /// <param name="serviceRequest">The <see cref="IServiceRequest"/> that describes the service that needs to be instantiated.</param>
        /// <returns>A valid object reference if the service can be found; otherwise, it will return <c>null</c>.</returns>
        public virtual object GetService(IServiceRequest serviceRequest)
        {
            // Allow users to intercept the instantiation process
            if (_preProcessor != null)
            {
                _preProcessor.Preprocess(serviceRequest);
            }

            var factoryRequest = new FactoryRequest
            {
                ServiceType = serviceRequest.ServiceType,
                ServiceName = serviceRequest.ServiceName,
                Arguments   = serviceRequest.ActualArguments,
                Container   = _container
            };

            var instance = _creator.CreateFrom(factoryRequest, serviceRequest.ActualFactory);

            // Postprocess the results
            var result = new ServiceRequestResult
            {
                ServiceName         = serviceRequest.ServiceName,
                ActualResult        = instance,
                Container           = _container,
                OriginalResult      = instance,
                ServiceType         = serviceRequest.ServiceType,
                AdditionalArguments = serviceRequest.ActualArguments
            };

            if (_postProcessor != null)
            {
                _postProcessor.PostProcess(result);
            }

            return(result.ActualResult ?? result.OriginalResult);
        }
Exemplo n.º 6
0
        public void SingletonFactoryShouldCreateTheSameInstanceOnce()
        {
            var factory = new SingletonFactory<ISerializable>(createInstance);
            var container = new ServiceContainer();

            var request = new FactoryRequest()
                              {
                                  ServiceName = null,
                                  Arguments = new object[0],
                                  Container = container,
                                  ServiceType = typeof(ISerializable)
                              };

            ISerializable first = factory.CreateInstance(request);
            ISerializable second = factory.CreateInstance(request);

            // Both instances must be the same
            Assert.AreSame(first, second);
            Assert.IsNotNull(first);
            Assert.IsNotNull(second);
        }