/src/LinFu.IoC/Configuration/DefaultActivator.cs

http://github.com/philiplaureano/LinFu · C# · 60 lines · 32 code · 11 blank · 17 comment · 0 complexity · f33070c43014b818df607c60e41fdf55 MD5 · raw file

  1. using System;
  2. using System.Reflection;
  3. using LinFu.AOP.Interfaces;
  4. using LinFu.IoC.Configuration.Interfaces;
  5. using LinFu.IoC.Interfaces;
  6. namespace LinFu.IoC.Configuration
  7. {
  8. /// <summary>
  9. /// Represents a class that can instantiate object instances.
  10. /// </summary>
  11. public class DefaultActivator : IActivator<IContainerActivationContext>, IInitialize
  12. {
  13. private IConstructorArgumentResolver _argumentResolver;
  14. private IMethodInvoke<ConstructorInfo> _constructorInvoke;
  15. private IMemberResolver<ConstructorInfo> _resolver;
  16. /// <summary>
  17. /// Creates an object instance.
  18. /// </summary>
  19. /// <returns>A valid object instance.</returns>
  20. public object CreateInstance(IContainerActivationContext context)
  21. {
  22. var container = context.Container;
  23. var additionalArguments = context.AdditionalArguments;
  24. var concreteType = context.TargetType;
  25. // Add the required services if necessary
  26. container.AddDefaultServices();
  27. var finderContext = new MethodFinderContext(new Type[0], additionalArguments, null);
  28. // Determine which constructor
  29. // contains the most resolvable
  30. // parameters
  31. var constructor = _resolver.ResolveFrom(concreteType, container, finderContext);
  32. // TODO: Allow users to insert their own custom constructor resolution routines here
  33. var arguments = _argumentResolver.GetConstructorArguments(constructor, container, additionalArguments);
  34. // Instantiate the object
  35. var result = _constructorInvoke.Invoke(null, constructor, arguments);
  36. return result;
  37. }
  38. /// <summary>
  39. /// Initializes the class with the default services.
  40. /// </summary>
  41. /// <param name="container">The target service container.</param>
  42. public void Initialize(IServiceContainer container)
  43. {
  44. _resolver = container.GetService<IMemberResolver<ConstructorInfo>>();
  45. _constructorInvoke = container.GetService<IMethodInvoke<ConstructorInfo>>();
  46. _argumentResolver = container.GetService<IConstructorArgumentResolver>();
  47. }
  48. }
  49. }