PrismDependencyResolver.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Prism.Ioc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Web.Http.Controllers;
  8. using System.Web.Http.Dependencies;
  9. namespace LocalhostMES.Controller
  10. {
  11. // 自定义的依赖解析器
  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. // 返回同一个作用域,因为 Prism 容器通常不支持作用域
  22. return this;
  23. }
  24. public object GetService(Type serviceType)
  25. {
  26. try
  27. {
  28. // 尝试从 Prism 容器解析
  29. // 1. 如果是控制器,从 Prism 容器解析
  30. if (typeof(IHttpController).IsAssignableFrom(serviceType))
  31. {
  32. return _containerProvider.Resolve(serviceType);
  33. }
  34. // 2. 如果是我们自己注册的类型,从 Prism 容器解析
  35. if (IsCustomType(serviceType))
  36. {
  37. return _containerProvider.Resolve(serviceType);
  38. }
  39. // 3. 其他类型(Web API 内置服务)返回 null,让 Web API 使用默认解析器
  40. return null;
  41. }
  42. catch (ContainerResolutionException)
  43. {
  44. // 如果类型未注册,返回 null(Web API 会使用默认构造函数)
  45. return null;
  46. }
  47. catch
  48. {
  49. return null;
  50. }
  51. }
  52. private bool IsCustomType(Type serviceType)
  53. {
  54. // 检查是否是我们自定义的类型
  55. var typeName = serviceType.FullName ?? "";
  56. // 添加我们需要处理的类型
  57. var customTypes = new[]
  58. {
  59. "LocalhostMES.Controller.Management",
  60. "LocalhostMES.Controller.ApiClient",
  61. // 添加其他需要从 Prism 容器解析的类型
  62. };
  63. return Array.Exists(customTypes, t => typeName.Contains(t));
  64. }
  65. public IEnumerable<object> GetServices(Type serviceType)
  66. {
  67. try
  68. {
  69. // 对于集合类型,尝试解析 IEnumerable<T>
  70. var enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
  71. var services = _containerProvider.Resolve(enumerableType);
  72. return (IEnumerable<object>)services;
  73. }
  74. catch
  75. {
  76. return Enumerable.Empty<object>();
  77. }
  78. }
  79. public void Dispose()
  80. {
  81. // 清理资源
  82. }
  83. }
  84. }