PrismDependencyResolver.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Prism.Ioc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web.Http.Controllers;
  6. using System.Web.Http.Dependencies;
  7. namespace LocalhostMES.Infrastructure
  8. {
  9. /// <summary>
  10. /// Web API 与 Prism 容器桥接(需要时可在此扩展从容器解析的类型)。
  11. /// </summary>
  12. public class PrismDependencyResolver : IDependencyResolver
  13. {
  14. private readonly IContainerProvider _containerProvider;
  15. public PrismDependencyResolver(IContainerProvider containerProvider)
  16. {
  17. _containerProvider = containerProvider;
  18. }
  19. public IDependencyScope BeginScope()
  20. {
  21. return this;
  22. }
  23. public object GetService(Type serviceType)
  24. {
  25. try
  26. {
  27. if (typeof(IHttpController).IsAssignableFrom(serviceType))
  28. {
  29. return _containerProvider.Resolve(serviceType);
  30. }
  31. if (IsRegisteredCustomType(serviceType))
  32. {
  33. return _containerProvider.Resolve(serviceType);
  34. }
  35. return null;
  36. }
  37. catch (ContainerResolutionException)
  38. {
  39. return null;
  40. }
  41. catch
  42. {
  43. return null;
  44. }
  45. }
  46. private static bool IsRegisteredCustomType(Type serviceType)
  47. {
  48. // 当前控制器均使用无参构造;若后续有需注入单例,在此按类型或命名空间登记。
  49. return false;
  50. }
  51. public IEnumerable<object> GetServices(Type serviceType)
  52. {
  53. try
  54. {
  55. var enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
  56. var services = _containerProvider.Resolve(enumerableType);
  57. return (IEnumerable<object>)services;
  58. }
  59. catch
  60. {
  61. return Enumerable.Empty<object>();
  62. }
  63. }
  64. public void Dispose()
  65. {
  66. }
  67. }
  68. }