PageRenderTime 43ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/src/LinFu.IoC/DefaultGetServiceBehavior.cs

http://github.com/philiplaureano/LinFu
C# | 89 lines | 52 code | 10 blank | 27 comment | 4 complexity | 00887822bdf29ec1b82ff4b2944d376c MD5 | raw file
  1. using LinFu.IoC.Interfaces;
  2. namespace LinFu.IoC
  3. {
  4. /// <summary>
  5. /// Represents the default implementation for the <see cref="IGetService" /> interface.
  6. /// </summary>
  7. public class DefaultGetServiceBehavior :
  8. IGetService
  9. {
  10. private readonly IServiceContainer _container;
  11. private readonly ICreateInstance _creator;
  12. private readonly IPostProcessor _postProcessor;
  13. private readonly IPreProcessor _preProcessor;
  14. /// <summary>
  15. /// Initializes the class with the given <paramref name="container" /> instance.
  16. /// </summary>
  17. /// <param name="container">The target service container.</param>
  18. public DefaultGetServiceBehavior(IServiceContainer container)
  19. {
  20. _container = container;
  21. _creator = new DefaultCreator();
  22. _preProcessor = new CompositePreProcessor(container.PreProcessors);
  23. _postProcessor = new CompositePostProcessor(container.PostProcessors);
  24. }
  25. /// <summary>
  26. /// Initializes the class with the given <paramref name="container" /> instance.
  27. /// </summary>
  28. /// <param name="container">The target service container.</param>
  29. /// <param name="creator">The <see cref="ICreateInstance" /> instance responsible for instantiating service types.</param>
  30. /// <param name="preProcessor">The <see cref="IPreProcessor" /> that will allow users to intercept a given service request.</param>
  31. /// <param name="postProcessor">
  32. /// The <see cref="IPostProcessor" /> instance that will handle the results of a given service
  33. /// request.
  34. /// </param>
  35. public DefaultGetServiceBehavior(IServiceContainer container, ICreateInstance creator,
  36. IPreProcessor preProcessor, IPostProcessor postProcessor)
  37. {
  38. _container = container;
  39. _creator = creator;
  40. _preProcessor = preProcessor;
  41. _postProcessor = postProcessor;
  42. }
  43. /// <summary>
  44. /// Instantiates the service described by the <paramref name="serviceRequest" />.
  45. /// </summary>
  46. /// <param name="serviceRequest">
  47. /// The <see cref="IServiceRequest" /> that describes the service that needs to be
  48. /// instantiated.
  49. /// </param>
  50. /// <returns>A valid object reference if the service can be found; otherwise, it will return <c>null</c>.</returns>
  51. public virtual object GetService(IServiceRequest serviceRequest)
  52. {
  53. // Allow users to intercept the instantiation process
  54. if (_preProcessor != null)
  55. _preProcessor.Preprocess(serviceRequest);
  56. var factoryRequest = new FactoryRequest
  57. {
  58. ServiceType = serviceRequest.ServiceType,
  59. ServiceName = serviceRequest.ServiceName,
  60. Arguments = serviceRequest.ActualArguments,
  61. Container = _container
  62. };
  63. var instance = _creator.CreateFrom(factoryRequest, serviceRequest.ActualFactory);
  64. // Postprocess the results
  65. var result = new ServiceRequestResult
  66. {
  67. ServiceName = serviceRequest.ServiceName,
  68. ActualResult = instance,
  69. Container = _container,
  70. OriginalResult = instance,
  71. ServiceType = serviceRequest.ServiceType,
  72. AdditionalArguments = serviceRequest.ActualArguments
  73. };
  74. if (_postProcessor != null)
  75. _postProcessor.PostProcess(result);
  76. return result.ActualResult ?? result.OriginalResult;
  77. }
  78. }
  79. }