diff --git a/zero.Core/Api/ApplicationContext.cs b/zero.Core/Api/ApplicationContext.cs
index f8d19f65..1b0b99d1 100644
--- a/zero.Core/Api/ApplicationContext.cs
+++ b/zero.Core/Api/ApplicationContext.cs
@@ -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;
diff --git a/zero.Core/Routing/AbtractRouteProvider.cs b/zero.Core/Routing/AbtractRouteProvider.cs
index a228883c..1ac08194 100644
--- a/zero.Core/Routing/AbtractRouteProvider.cs
+++ b/zero.Core/Routing/AbtractRouteProvider.cs
@@ -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"
+ };
+ }
+
+
+ ///
+ /// Map a route to an MVC endpoint
+ ///
+ public virtual RouteProviderEndpoint MapEndpoint(IResolvedRoute route)
+ {
+ return DefaultEndpoint;
}
diff --git a/zero.Core/Routing/IRouteProvider.cs b/zero.Core/Routing/IRouteProvider.cs
index 2c2477f9..7f5b3c86 100644
--- a/zero.Core/Routing/IRouteProvider.cs
+++ b/zero.Core/Routing/IRouteProvider.cs
@@ -26,9 +26,10 @@ namespace zero.Core.Routing
Type[] AffectedTypes { get; }
- string Controller { get; }
-
- string Action { get; }
+ ///
+ /// Map a route to an MVC endpoint
+ ///
+ RouteProviderEndpoint MapEndpoint(IResolvedRoute route);
///
/// Resolve a route and load optional dependencies into it.
diff --git a/zero.Core/Routing/Page/IPageEndpointResolver.cs b/zero.Core/Routing/Page/IPageEndpointResolver.cs
new file mode 100644
index 00000000..c336940b
--- /dev/null
+++ b/zero.Core/Routing/Page/IPageEndpointResolver.cs
@@ -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
+ {
+ ///
+ /// Get MVC endpoint for the page route
+ ///
+ RouteProviderEndpoint GetEndpoint(PageRoute route);
+ }
+}
diff --git a/zero.Core/Routing/IPageUrlBuilder.cs b/zero.Core/Routing/Page/IPageUrlBuilder.cs
similarity index 100%
rename from zero.Core/Routing/IPageUrlBuilder.cs
rename to zero.Core/Routing/Page/IPageUrlBuilder.cs
diff --git a/zero.Core/Routing/Page/PageEndpointResolver.cs b/zero.Core/Routing/Page/PageEndpointResolver.cs
new file mode 100644
index 00000000..162d6f33
--- /dev/null
+++ b/zero.Core/Routing/Page/PageEndpointResolver.cs
@@ -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;
+ }
+ }
+}
diff --git a/zero.Core/Routing/PageRoute.cs b/zero.Core/Routing/Page/PageRoute.cs
similarity index 100%
rename from zero.Core/Routing/PageRoute.cs
rename to zero.Core/Routing/Page/PageRoute.cs
diff --git a/zero.Core/Routing/PageRouteProvider.cs b/zero.Core/Routing/Page/PageRouteProvider.cs
similarity index 87%
rename from zero.Core/Routing/PageRouteProvider.cs
rename to zero.Core/Routing/Page/PageRouteProvider.cs
index 58382569..48584520 100644
--- a/zero.Core/Routing/PageRouteProvider.cs
+++ b/zero.Core/Routing/Page/PageRouteProvider.cs
@@ -19,11 +19,25 @@ namespace zero.Core.Routing
protected IPageUrlBuilder UrlBuilder { get; set; }
+ protected IPageEndpointResolver EndpointResolver { get; set; }
- public PageRouteProvider(ILogger logger, IPageUrlBuilder urlBuilder) : base("zero.pages")
+
+ public PageRouteProvider(ILogger logger, IPageUrlBuilder urlBuilder, IPageEndpointResolver endpointResolver) : base("zero.pages")
{
Logger = logger;
UrlBuilder = urlBuilder;
+ EndpointResolver = endpointResolver;
+ }
+
+
+ ///
+ public override RouteProviderEndpoint MapEndpoint(IResolvedRoute route)
+ {
+ if (!(route is PageRoute))
+ {
+ return base.MapEndpoint(route);
+ }
+ return EndpointResolver.GetEndpoint(route as PageRoute);
}
diff --git a/zero.Core/Routing/PageUrlBuilder.cs b/zero.Core/Routing/Page/PageUrlBuilder.cs
similarity index 100%
rename from zero.Core/Routing/PageUrlBuilder.cs
rename to zero.Core/Routing/Page/PageUrlBuilder.cs
diff --git a/zero.Core/Routing/RouteProviderEndpoint.cs b/zero.Core/Routing/RouteProviderEndpoint.cs
index 1eded02e..9a66e727 100644
--- a/zero.Core/Routing/RouteProviderEndpoint.cs
+++ b/zero.Core/Routing/RouteProviderEndpoint.cs
@@ -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; }
diff --git a/zero.Core/Routing/Routes.cs b/zero.Core/Routing/Routes.cs
index ba04b1a3..0d4876df 100644
--- a/zero.Core/Routing/Routes.cs
+++ b/zero.Core/Routing/Routes.cs
@@ -102,7 +102,7 @@ namespace zero.Core.Routing
///
public async Task 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
///
- 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
///
/// Get endpoint the route maps to
///
- RouteProviderEndpoint GetEndpoint(IRoute route);
+ RouteProviderEndpoint MapEndpoint(IResolvedRoute route);
}
}
diff --git a/zero.Web/Defaults/ZeroBackofficePlugin.cs b/zero.Web/Defaults/ZeroBackofficePlugin.cs
index 26ba9ed6..8a8083b0 100644
--- a/zero.Web/Defaults/ZeroBackofficePlugin.cs
+++ b/zero.Web/Defaults/ZeroBackofficePlugin.cs
@@ -92,6 +92,7 @@ namespace zero.Web.Defaults
services.AddScoped();
services.AddScoped();
+ services.AddScoped();
//services.AddTransient();
services.AddScoped();
services.AddScoped();
diff --git a/zero.Web/Routing/ZeroRoutesTransformer.cs b/zero.Web/Routing/ZeroRoutesTransformer.cs
index d14e1825..ce83928e 100644
--- a/zero.Web/Routing/ZeroRoutesTransformer.cs
+++ b/zero.Web/Routing/ZeroRoutesTransformer.cs
@@ -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;