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));
}
}
}