/// <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; }
/// <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)); }
/// <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); }
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(); }
/// <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); }
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); }