diff --git a/samples/MvcSample/Startup.cs b/samples/MvcSample/Startup.cs index c92183b422..ed65c7376e 100644 --- a/samples/MvcSample/Startup.cs +++ b/samples/MvcSample/Startup.cs @@ -1,10 +1,14 @@ -#if NET45 + +#if NET45 using System; +using System.Collections.Generic; using System.IO; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc.Routing; +using Microsoft.AspNet.Routing.Owin; +using Microsoft.AspNet.Routing.Template; using Microsoft.AspNet.Mvc.Startup; using Owin; @@ -27,15 +31,13 @@ namespace MvcSample var mvcServices = new MvcServices(appRoot); - var handler = ActivatorUtilities.CreateInstance(mvcServices.Services); + var router = builder.UseRouter(); - builder.Run(async context => - { - // Pretending to be routing - var routeData = new FakeRouteData(context); - - await handler.ExecuteAsync(context, routeData); - }); + var endpoint = ActivatorUtilities.CreateInstance(mvcServices.Services); + router.Add(new TemplateRoute( + endpoint, + "{controller}/{action}", + new Dictionary(StringComparer.OrdinalIgnoreCase){ { "controller", "Home"}, { "action", "Index" } })); } } } diff --git a/samples/MvcSample/project.json b/samples/MvcSample/project.json index 0dae194f70..a7043ca0bf 100644 --- a/samples/MvcSample/project.json +++ b/samples/MvcSample/project.json @@ -5,6 +5,7 @@ "Microsoft.AspNet.Abstractions": "0.1-alpha-*", "Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*", "Microsoft.AspNet.Razor" : "0.1-alpha-*", + "Microsoft.AspNet.Routing" : "0.1-alpha-*", "Microsoft.AspNet.Mvc" : "", "Microsoft.AspNet.Mvc.ModelBinding" : "", "Microsoft.AspNet.Mvc.Rendering" : "", diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/IRouteData.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/IRouteData.cs deleted file mode 100644 index a12b7ce57b..0000000000 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/IRouteData.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.AspNet.Abstractions; - -namespace Microsoft.AspNet.Mvc.Routing -{ - // Move to routing middleware - public interface IRouteData - { - string GetRouteValue(string name); - } - - public class FakeRouteData : IRouteData - { - private readonly string[] _parts; - - public FakeRouteData(HttpContext context) - { - _parts = (context.Request.PathBase + context.Request.Path).Value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - } - - public string GetRouteValue(string name) - { - if (name.Equals("controller", StringComparison.OrdinalIgnoreCase)) - { - return GetPartOrDefault(0, "Home"); - } - else if (name.Equals("action", StringComparison.OrdinalIgnoreCase)) - { - return GetPartOrDefault(1, "Index"); - } - - return null; - } - - private string GetPartOrDefault(int index, string defaultValue) - { - return index < _parts.Length ? _parts[index] : defaultValue; - } - } -} diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/RequestContext.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/RequestContext.cs index f58fb16115..ba2f67711c 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/RequestContext.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/RequestContext.cs @@ -1,28 +1,28 @@ using System; +using System.Collections.Generic; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Mvc.Routing; namespace Microsoft.AspNet.Mvc { public class RequestContext { - public RequestContext(HttpContext context, IRouteData routeData) + public RequestContext(HttpContext context, IDictionary routeValues) { if (context == null) { throw new ArgumentNullException("context"); } - if (routeData == null) + if (routeValues == null) { - throw new ArgumentNullException("routeData"); + throw new ArgumentNullException("routeValues"); } HttpContext = context; - RouteData = routeData; + RouteValues = routeValues; } - public virtual IRouteData RouteData { get; set; } + public virtual IDictionary RouteValues { get; set; } public virtual HttpContext HttpContext { get; set; } } diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/ViewContext.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/ViewContext.cs index 00574dfce9..1bc8ba2f9f 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/ViewContext.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/ViewContext.cs @@ -1,13 +1,13 @@ using System; +using System.Collections.Generic; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Mvc.Routing; namespace Microsoft.AspNet.Mvc.ModelBinding { public class ViewContext : RequestContext { - public ViewContext(HttpContext context, IRouteData routeData, ViewData viewData) : - base(context, routeData) + public ViewContext(HttpContext context, IDictionary routeValues, ViewData viewData) : + base(context, routeValues) { ViewData = viewData; } diff --git a/src/Microsoft.AspNet.Mvc.Startup/MvcHandler.cs b/src/Microsoft.AspNet.Mvc.Startup/MvcHandler.cs deleted file mode 100644 index 532767e517..0000000000 --- a/src/Microsoft.AspNet.Mvc.Startup/MvcHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.Mvc.Routing; - -namespace Microsoft.AspNet.Mvc -{ - public class MvcHandler - { - private readonly IActionInvokerFactory _actionInvokerFactory; - - public MvcHandler(IActionInvokerFactory actionInvokerFactory) - { - _actionInvokerFactory = actionInvokerFactory; - } - - public Task ExecuteAsync(HttpContext context, IRouteData routeData) - { - var requestContext = new RequestContext(context, routeData); - - var invoker = _actionInvokerFactory.CreateInvoker(requestContext); - - return invoker.InvokeActionAsync(); - } - } -} diff --git a/src/Microsoft.AspNet.Mvc.Startup/MvcServices.cs b/src/Microsoft.AspNet.Mvc.Startup/MvcServices.cs index 01e69cdef5..2d8bce2b35 100644 --- a/src/Microsoft.AspNet.Mvc.Startup/MvcServices.cs +++ b/src/Microsoft.AspNet.Mvc.Startup/MvcServices.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.FileSystems; using Microsoft.AspNet.Mvc.Razor; +using Microsoft.AspNet.Mvc.Routing; +using Microsoft.AspNet.Routing; namespace Microsoft.AspNet.Mvc.Startup { diff --git a/src/Microsoft.AspNet.Mvc.Startup/project.json b/src/Microsoft.AspNet.Mvc.Startup/project.json index 0aeddb4cae..216ef68e3c 100644 --- a/src/Microsoft.AspNet.Mvc.Startup/project.json +++ b/src/Microsoft.AspNet.Mvc.Startup/project.json @@ -5,6 +5,7 @@ "Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*", "Microsoft.AspNet.FileSystems" : "0.1-alpha-*", "Microsoft.AspNet.Razor" : "0.1-alpha-*", + "Microsoft.AspNet.Routing" : "0.1-alpha-*", "Microsoft.AspNet.Mvc": "", "Microsoft.AspNet.Mvc.Razor": "", "Microsoft.AspNet.Mvc.ModelBinding" : "", diff --git a/src/Microsoft.AspNet.Mvc/ActionDescriptorProvider.cs b/src/Microsoft.AspNet.Mvc/ActionDescriptorProvider.cs index 57d48a794e..8b46ce387d 100644 --- a/src/Microsoft.AspNet.Mvc/ActionDescriptorProvider.cs +++ b/src/Microsoft.AspNet.Mvc/ActionDescriptorProvider.cs @@ -4,8 +4,8 @@ { public RouteContext CreateDescriptor(RequestContext requestContext) { - string controllerName = requestContext.RouteData.GetRouteValue("controller"); - string actionName = requestContext.RouteData.GetRouteValue("action"); + var controllerName = (string)requestContext.RouteValues["controller"]; + var actionName = (string)requestContext.RouteValues["action"]; return new ControllerActionRouteContext { diff --git a/src/Microsoft.AspNet.Mvc/ActionInvokerFactory.cs b/src/Microsoft.AspNet.Mvc/ActionInvokerFactory.cs index dde0127cd1..3ba8314086 100644 --- a/src/Microsoft.AspNet.Mvc/ActionInvokerFactory.cs +++ b/src/Microsoft.AspNet.Mvc/ActionInvokerFactory.cs @@ -21,7 +21,11 @@ namespace Microsoft.AspNet.Mvc public IActionInvoker CreateInvoker(RequestContext requestContext) { RouteContext routeContext = _routeContextProvider.CreateDescriptor(requestContext); - + if (routeContext == null) + { + return null; + } + return _actionInvokerProvider.GetInvoker(requestContext, routeContext); } } diff --git a/src/Microsoft.AspNet.Mvc/ActionResults/ViewResult.cs b/src/Microsoft.AspNet.Mvc/ActionResults/ViewResult.cs index 55a84d59a6..58a6a1f962 100644 --- a/src/Microsoft.AspNet.Mvc/ActionResults/ViewResult.cs +++ b/src/Microsoft.AspNet.Mvc/ActionResults/ViewResult.cs @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Mvc context.HttpContext.Response.ContentType = "text/html"; using (var writer = new StreamWriter(context.HttpContext.Response.Body, Encoding.UTF8, 1024, leaveOpen: true)) { - var viewContext = new ViewContext(context.HttpContext, context.RouteData, ViewData) + var viewContext = new ViewContext(context.HttpContext, context.RouteValues, ViewData) { ServiceProvider = _serviceProvider }; diff --git a/src/Microsoft.AspNet.Mvc/Routing/RouteEndpoint.cs b/src/Microsoft.AspNet.Mvc/Routing/RouteEndpoint.cs new file mode 100644 index 0000000000..118a640c8a --- /dev/null +++ b/src/Microsoft.AspNet.Mvc/Routing/RouteEndpoint.cs @@ -0,0 +1,52 @@ + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Routing; + +namespace Microsoft.AspNet.Mvc.Routing +{ + public class RouteEndpoint : IRouteEndpoint + { + private readonly IServiceProvider _services; + private IActionInvokerFactory _actionInvokerFactory; + + // Using service provider here to prevent ordering issues with configuration... + // IE: creating routes before configuring services, vice-versa. + public RouteEndpoint(IServiceProvider services) + { + _services = services; + } + + private IActionInvokerFactory ActionInvokerFactory + { + get + { + if (_actionInvokerFactory == null) + { + _actionInvokerFactory = _services.GetService(); + } + + return _actionInvokerFactory; + } + } + + public async Task Send(HttpContext context) + { + var routeValues = context.GetFeature(); + var requestContext = new RequestContext(context, routeValues.Values); + + var invoker = ActionInvokerFactory.CreateInvoker(requestContext); + if (invoker == null) + { + return false; + } + else + { + await invoker.InvokeActionAsync(); + return true; + } + } + } +} diff --git a/src/Microsoft.AspNet.Mvc/project.json b/src/Microsoft.AspNet.Mvc/project.json index 608143d2bc..7d8514cbc1 100644 --- a/src/Microsoft.AspNet.Mvc/project.json +++ b/src/Microsoft.AspNet.Mvc/project.json @@ -4,6 +4,7 @@ "Newtonsoft.Json": "5.0.8", "Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*", "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.Routing": "0.1-alpha-*", "Microsoft.AspNet.Mvc.ModelBinding": "", "Microsoft.AspNet.Mvc.Rendering": "" },