ScopedIocResolver.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Abp.Dependency
  5. {
  6. public class ScopedIocResolver : IScopedIocResolver
  7. {
  8. private readonly IIocResolver _iocResolver;
  9. private readonly List<object> _resolvedObjects;
  10. public ScopedIocResolver(IIocResolver iocResolver)
  11. {
  12. _iocResolver = iocResolver;
  13. _resolvedObjects = new List<object>();
  14. }
  15. public T Resolve<T>()
  16. {
  17. return Resolve<T>(typeof(T));
  18. }
  19. public T Resolve<T>(Type type)
  20. {
  21. return (T)Resolve(type);
  22. }
  23. public T Resolve<T>(object argumentsAsAnonymousType)
  24. {
  25. return (T)Resolve(typeof(T), argumentsAsAnonymousType);
  26. }
  27. public object Resolve(Type type)
  28. {
  29. return Resolve(type, null);
  30. }
  31. public object Resolve(Type type, object argumentsAsAnonymousType)
  32. {
  33. var resolvedObject = argumentsAsAnonymousType != null
  34. ? _iocResolver.Resolve(type, argumentsAsAnonymousType)
  35. : _iocResolver.Resolve(type);
  36. _resolvedObjects.Add(resolvedObject);
  37. return resolvedObject;
  38. }
  39. public T[] ResolveAll<T>()
  40. {
  41. return ResolveAll(typeof(T)).OfType<T>().ToArray();
  42. }
  43. public T[] ResolveAll<T>(object argumentsAsAnonymousType)
  44. {
  45. return ResolveAll(typeof(T), argumentsAsAnonymousType).OfType<T>().ToArray();
  46. }
  47. public object[] ResolveAll(Type type)
  48. {
  49. return ResolveAll(type, null);
  50. }
  51. public object[] ResolveAll(Type type, object argumentsAsAnonymousType)
  52. {
  53. var resolvedObjects = argumentsAsAnonymousType != null
  54. ? _iocResolver.ResolveAll(type, argumentsAsAnonymousType)
  55. : _iocResolver.ResolveAll(type);
  56. _resolvedObjects.AddRange(resolvedObjects);
  57. return resolvedObjects;
  58. }
  59. public void Release(object obj)
  60. {
  61. _resolvedObjects.Remove(obj);
  62. _iocResolver.Release(obj);
  63. }
  64. public bool IsRegistered(Type type)
  65. {
  66. return _iocResolver.IsRegistered(type);
  67. }
  68. public bool IsRegistered<T>()
  69. {
  70. return IsRegistered(typeof(T));
  71. }
  72. public void Dispose()
  73. {
  74. _resolvedObjects.ForEach(_iocResolver.Release);
  75. }
  76. }
  77. }