introduct IPageEndpointResolver which resolves a route to an MVC endpoint

This commit is contained in:
2020-10-27 11:50:20 +01:00
parent 690fa36cf4
commit edfb6ec2e5
13 changed files with 98 additions and 21 deletions
+5
View File
@@ -60,6 +60,11 @@ namespace zero.Core.Api
app = await ResolveFromRequest(context);
}
if (app == null)
{
throw new NullReferenceException($"Could not resolve application for host {context.Request.Host}");
}
App = app;
AppId = app?.Id;
+18 -7
View File
@@ -11,21 +11,32 @@ namespace zero.Core.Routing
public virtual Type[] AffectedTypes { get; protected set; }
public virtual string Controller { get; protected set; }
public virtual string Action { get; protected set; }
public const string ID_PREFIX = "routes.";
public const char SLASH = '/';
protected RouteProviderEndpoint DefaultEndpoint { get; set; }
public AbtractRouteProvider(string alias)
{
Alias = alias;
AffectedTypes = new Type[1] { typeof(T) };
Controller = "DefaultRoute";
Action = "Index";
AffectedTypes = new Type[1] { typeof(T) };
DefaultEndpoint = new RouteProviderEndpoint()
{
Controller = "DefaultRoute",
Action = "Index"
};
}
/// <summary>
/// Map a route to an MVC endpoint
/// </summary>
public virtual RouteProviderEndpoint MapEndpoint(IResolvedRoute route)
{
return DefaultEndpoint;
}
+4 -3
View File
@@ -26,9 +26,10 @@ namespace zero.Core.Routing
Type[] AffectedTypes { get; }
string Controller { get; }
string Action { get; }
/// <summary>
/// Map a route to an MVC endpoint
/// </summary>
RouteProviderEndpoint MapEndpoint(IResolvedRoute route);
/// <summary>
/// Resolve a route and load optional dependencies into it.
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using zero.Core.Api;
using zero.Core.Entities;
namespace zero.Core.Routing
{
public interface IPageEndpointResolver
{
/// <summary>
/// Get MVC endpoint for the page route
/// </summary>
RouteProviderEndpoint GetEndpoint(PageRoute route);
}
}
@@ -0,0 +1,23 @@
namespace zero.Core.Routing
{
public class PageEndpointResolver : IPageEndpointResolver
{
protected RouteProviderEndpoint DefaultEndpoint { get; set; }
public PageEndpointResolver()
{
DefaultEndpoint = new RouteProviderEndpoint()
{
Controller = "DefaultRoute",
Action = "Index"
};
}
public virtual RouteProviderEndpoint GetEndpoint(PageRoute route)
{
return DefaultEndpoint;
}
}
}
@@ -19,11 +19,25 @@ namespace zero.Core.Routing
protected IPageUrlBuilder UrlBuilder { get; set; }
protected IPageEndpointResolver EndpointResolver { get; set; }
public PageRouteProvider(ILogger<PageRouteProvider> logger, IPageUrlBuilder urlBuilder) : base("zero.pages")
public PageRouteProvider(ILogger<PageRouteProvider> logger, IPageUrlBuilder urlBuilder, IPageEndpointResolver endpointResolver) : base("zero.pages")
{
Logger = logger;
UrlBuilder = urlBuilder;
EndpointResolver = endpointResolver;
}
/// <inheritdoc />
public override RouteProviderEndpoint MapEndpoint(IResolvedRoute route)
{
if (!(route is PageRoute))
{
return base.MapEndpoint(route);
}
return EndpointResolver.GetEndpoint(route as PageRoute);
}
@@ -2,6 +2,14 @@
{
public class RouteProviderEndpoint
{
public RouteProviderEndpoint() { }
public RouteProviderEndpoint(string controller, string action = "Index")
{
Controller = controller;
Action = action;
}
public string Controller { get; set; }
public string Action { get; set; }
+5 -9
View File
@@ -102,7 +102,7 @@ namespace zero.Core.Routing
/// <inheritdoc />
public async Task<IResolvedRoute> ResolveUrl(HttpContext context)
{
IApplication app = await Context.ResolveFromRequest(context);
IApplication app = await Context.Resolve(context);
string path = context.Request.Path;
return await ResolveUrl(app.Id, path);
@@ -154,14 +154,10 @@ namespace zero.Core.Routing
/// <inheritdoc />
public RouteProviderEndpoint GetEndpoint(IRoute route)
public RouteProviderEndpoint MapEndpoint(IResolvedRoute route)
{
IRouteProvider routeProvider = FindProvider(route.ProviderAlias);
return routeProvider != null ? new RouteProviderEndpoint()
{
Controller = routeProvider.Controller,
Action = routeProvider.Action
} : null;
IRouteProvider routeProvider = FindProvider(route.Route.ProviderAlias);
return routeProvider?.MapEndpoint(route);
}
@@ -237,6 +233,6 @@ namespace zero.Core.Routing
/// <summary>
/// Get endpoint the route maps to
/// </summary>
RouteProviderEndpoint GetEndpoint(IRoute route);
RouteProviderEndpoint MapEndpoint(IResolvedRoute route);
}
}
@@ -92,6 +92,7 @@ namespace zero.Web.Defaults
services.AddScoped<IRoutes, Routes>();
services.AddScoped<IPageUrlBuilder, PageUrlBuilder>();
services.AddScoped<IPageEndpointResolver, PageEndpointResolver>();
//services.AddTransient<IUrlProvider, PageUrlProvider>();
services.AddScoped<IRouteProvider, PageRouteProvider>();
services.AddScoped<PageRouteProvider>();
+1 -1
View File
@@ -28,7 +28,7 @@ namespace zero.Web.Routing
return null;
}
RouteProviderEndpoint endpoint = Routes.GetEndpoint(route.Route);
RouteProviderEndpoint endpoint = Routes.MapEndpoint(route);
values["zero.app"] = await Context.Resolve(httpContext);
values["zero.route"] = route;