RoutePublisher.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using GreenTree.Nachtragsmanagement.Core;
  2. using GreenTree.Nachtragsmanagement.Core.Plugins;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web.Routing;
  9. namespace GreenTree.Nachtragsmanagement.Web.Framework.Mvc.Routes
  10. {
  11. public class RoutePublisher : IRoutePublisher
  12. {
  13. protected readonly ITypeFinder typeFinder;
  14. /// <summary>
  15. /// Ctor
  16. /// </summary>
  17. /// <param name="typeFinder"></param>
  18. public RoutePublisher(ITypeFinder typeFinder)
  19. {
  20. this.typeFinder = typeFinder;
  21. }
  22. /// <summary>
  23. /// Find a plugin descriptor by some type which is located into its assembly
  24. /// </summary>
  25. /// <param name="providerType">Provider type</param>
  26. /// <returns>Plugin descriptor</returns>
  27. protected virtual PluginDescriptor FindPlugin(Type providerType)
  28. {
  29. if (providerType == null)
  30. throw new ArgumentNullException("providerType");
  31. foreach (var plugin in PluginManager.ReferencedPlugins)
  32. {
  33. if (plugin.ReferencedAssembly == null)
  34. continue;
  35. if (plugin.ReferencedAssembly.FullName == providerType.Assembly.FullName)
  36. return plugin;
  37. }
  38. return null;
  39. }
  40. /// <summary>
  41. /// Register routes
  42. /// </summary>
  43. /// <param name="routes">Routes</param>
  44. public virtual void RegisterRoutes(RouteCollection routes)
  45. {
  46. var routeProviderTypes = typeFinder.FindClassesOfType<IRouteProvider>();
  47. var routeProviders = new List<IRouteProvider>();
  48. foreach (var providerType in routeProviderTypes)
  49. {
  50. //Ignore not installed plugins
  51. var plugin = FindPlugin(providerType);
  52. if (plugin != null && !plugin.Installed)
  53. continue;
  54. var provider = Activator.CreateInstance(providerType) as IRouteProvider;
  55. routeProviders.Add(provider);
  56. }
  57. routeProviders = routeProviders.OrderByDescending(rp => rp.Priority).ToList();
  58. routeProviders.ForEach(rp => rp.RegisterRoutes(routes));
  59. }
  60. }
  61. }