using GreenTree.Nachtragsmanagement.Core; using GreenTree.Nachtragsmanagement.Core.Plugins; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Routing; namespace GreenTree.Nachtragsmanagement.Web.Framework.Mvc.Routes { public class RoutePublisher : IRoutePublisher { protected readonly ITypeFinder typeFinder; /// /// Ctor /// /// public RoutePublisher(ITypeFinder typeFinder) { this.typeFinder = typeFinder; } /// /// Find a plugin descriptor by some type which is located into its assembly /// /// Provider type /// Plugin descriptor protected virtual PluginDescriptor FindPlugin(Type providerType) { if (providerType == null) throw new ArgumentNullException("providerType"); foreach (var plugin in PluginManager.ReferencedPlugins) { if (plugin.ReferencedAssembly == null) continue; if (plugin.ReferencedAssembly.FullName == providerType.Assembly.FullName) return plugin; } return null; } /// /// Register routes /// /// Routes public virtual void RegisterRoutes(RouteCollection routes) { var routeProviderTypes = typeFinder.FindClassesOfType(); var routeProviders = new List(); foreach (var providerType in routeProviderTypes) { //Ignore not installed plugins var plugin = FindPlugin(providerType); if (plugin != null && !plugin.Installed) continue; var provider = Activator.CreateInstance(providerType) as IRouteProvider; routeProviders.Add(provider); } routeProviders = routeProviders.OrderByDescending(rp => rp.Priority).ToList(); routeProviders.ForEach(rp => rp.RegisterRoutes(routes)); } } }