Added IActionResultHelper and other services.
- Support the Initialize pattern as an alternate ctor.
This commit is contained in:
parent
b575d2c337
commit
485eb48114
|
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc
|
||||||
|
{
|
||||||
|
public class ActionResultHelper : IActionResultHelper
|
||||||
|
{
|
||||||
|
public IActionResult Content(string value)
|
||||||
|
{
|
||||||
|
return new ContentResult
|
||||||
|
{
|
||||||
|
Content = value
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Content(string value, string contentType)
|
||||||
|
{
|
||||||
|
return new ContentResult
|
||||||
|
{
|
||||||
|
Content = value,
|
||||||
|
ContentType = contentType
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Json(object value)
|
||||||
|
{
|
||||||
|
// TODO: Make this work at some point
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,12 +4,14 @@ using Microsoft.Owin;
|
||||||
namespace Microsoft.AspNet.Mvc
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public class Controller
|
public class Controller
|
||||||
{
|
{
|
||||||
public void Initialize(IOwinContext context)
|
public void Initialize(IActionResultHelper actionResultHelper)
|
||||||
{
|
{
|
||||||
Context = context;
|
Result = actionResultHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IActionResultHelper Result { get; private set; }
|
||||||
|
|
||||||
public IOwinContext Context { get; set; }
|
public IOwinContext Context { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc
|
||||||
|
{
|
||||||
|
public interface IActionResultHelper
|
||||||
|
{
|
||||||
|
IActionResult Content(string value);
|
||||||
|
IActionResult Content(string value, string contentType);
|
||||||
|
IActionResult Json(object value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="ActionResultHelper.cs" />
|
||||||
<Compile Include="ContentResult.cs" />
|
<Compile Include="ContentResult.cs" />
|
||||||
<Compile Include="EmptyResult.cs" />
|
<Compile Include="EmptyResult.cs" />
|
||||||
<Compile Include="IActionResult.cs" />
|
<Compile Include="IActionResult.cs" />
|
||||||
|
|
@ -51,6 +52,7 @@
|
||||||
<Compile Include="HttpStatusCodeResult.cs" />
|
<Compile Include="HttpStatusCodeResult.cs" />
|
||||||
<Compile Include="IActionInvoker.cs" />
|
<Compile Include="IActionInvoker.cs" />
|
||||||
<Compile Include="IActionInvokerFactory.cs" />
|
<Compile Include="IActionInvokerFactory.cs" />
|
||||||
|
<Compile Include="IActionResultHelper.cs" />
|
||||||
<Compile Include="IControllerFactory.cs" />
|
<Compile Include="IControllerFactory.cs" />
|
||||||
<Compile Include="MvcHandler.cs" />
|
<Compile Include="MvcHandler.cs" />
|
||||||
<Compile Include="MvcServices.cs" />
|
<Compile Include="MvcServices.cs" />
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNet.CoreServices;
|
using Microsoft.AspNet.CoreServices;
|
||||||
using Microsoft.Owin;
|
using Microsoft.Owin;
|
||||||
|
|
@ -35,22 +37,48 @@ namespace Microsoft.AspNet.Mvc
|
||||||
throw new InvalidOperationException(String.Format("Couldn't find controller '{0}'.", controllerName));
|
throw new InvalidOperationException(String.Format("Couldn't find controller '{0}'.", controllerName));
|
||||||
}
|
}
|
||||||
|
|
||||||
var controllerBase = controller as Controller;
|
|
||||||
|
|
||||||
if (controllerBase != null)
|
|
||||||
{
|
|
||||||
// TODO: Make this the controller context
|
|
||||||
controllerBase.Initialize(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
var controllerContext = new ControllerContext(context, controller);
|
var controllerContext = new ControllerContext(context, controller);
|
||||||
|
|
||||||
|
Initialize(controller, controllerContext);
|
||||||
|
|
||||||
IActionInvokerFactory invokerFactory = _serviceProvider.GetService<IActionInvokerFactory>();
|
IActionInvokerFactory invokerFactory = _serviceProvider.GetService<IActionInvokerFactory>();
|
||||||
var invoker = invokerFactory.CreateInvoker(controllerContext);
|
var invoker = invokerFactory.CreateInvoker(controllerContext);
|
||||||
|
|
||||||
return invoker.InvokeActionAsync(actionName);
|
return invoker.InvokeActionAsync(actionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Initialize(object controller, ControllerContext controllerContext)
|
||||||
|
{
|
||||||
|
var controllerType = controller.GetType();
|
||||||
|
|
||||||
|
foreach (var prop in controllerType.GetProperties())
|
||||||
|
{
|
||||||
|
if (prop.Name == "Context")
|
||||||
|
{
|
||||||
|
if (prop.PropertyType == typeof(IOwinContext))
|
||||||
|
{
|
||||||
|
prop.SetValue(controller, controllerContext.HttpContext);
|
||||||
|
}
|
||||||
|
else if (prop.PropertyType == typeof(IDictionary<string, object>))
|
||||||
|
{
|
||||||
|
prop.SetValue(controller, controllerContext.HttpContext.Environment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var method = controllerType.GetMethod("Initialize");
|
||||||
|
|
||||||
|
if (method == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var args = method.GetParameters()
|
||||||
|
.Select(p => _serviceProvider.GetService(p.ParameterType)).ToArray();
|
||||||
|
|
||||||
|
method.Invoke(controller, args);
|
||||||
|
}
|
||||||
|
|
||||||
private static string GetPartOrDefault(string[] parts, int index, string defaultValue)
|
private static string GetPartOrDefault(string[] parts, int index, string defaultValue)
|
||||||
{
|
{
|
||||||
return index < parts.Length ? parts[index] : defaultValue;
|
return index < parts.Length ? parts[index] : defaultValue;
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,11 @@ namespace Microsoft.AspNet.Mvc
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DoCallback(Action<Type, Type> callback)
|
public static void DoCallback(Action<Type, Type> callback)
|
||||||
{
|
{
|
||||||
callback(typeof(IControllerFactory), typeof(DefaultControllerFactory));
|
callback(typeof(IControllerFactory), typeof(DefaultControllerFactory));
|
||||||
callback(typeof(IActionInvokerFactory), typeof(ControllerActionInvokerFactory));
|
callback(typeof(IActionInvokerFactory), typeof(ControllerActionInvokerFactory));
|
||||||
|
callback(typeof(IActionResultHelper), typeof(ActionResultHelper));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
using Microsoft.AspNet.Mvc;
|
||||||
|
using Microsoft.Owin;
|
||||||
|
|
||||||
|
namespace MvcSample
|
||||||
|
{
|
||||||
|
public class Home2Controller
|
||||||
|
{
|
||||||
|
public Home2Controller(IActionResultHelper actionResultHelper)
|
||||||
|
{
|
||||||
|
Result = actionResultHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResultHelper Result { get; private set; }
|
||||||
|
|
||||||
|
public IOwinContext Context { get; private set; }
|
||||||
|
|
||||||
|
public string Index()
|
||||||
|
{
|
||||||
|
return "Hello World";
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Something()
|
||||||
|
{
|
||||||
|
return new ContentResult
|
||||||
|
{
|
||||||
|
Content = "Hello World From Content"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Hello()
|
||||||
|
{
|
||||||
|
return Result.Content("Hello World");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Raw()
|
||||||
|
{
|
||||||
|
Context.Response.Write("Hello World raw");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
using Microsoft.AspNet.Mvc;
|
using Microsoft.AspNet.Mvc;
|
||||||
|
using Microsoft.Owin;
|
||||||
|
|
||||||
namespace MvcSample
|
namespace MvcSample
|
||||||
{
|
{
|
||||||
public class HomeController
|
public class HomeController : Controller
|
||||||
{
|
{
|
||||||
public string Index()
|
public string Index()
|
||||||
{
|
{
|
||||||
|
|
@ -16,5 +17,15 @@ namespace MvcSample
|
||||||
Content = "Hello World From Content"
|
Content = "Hello World From Content"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IActionResult Hello()
|
||||||
|
{
|
||||||
|
return Result.Content("Hello World");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Raw()
|
||||||
|
{
|
||||||
|
Context.Response.Write("Hello World raw");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -54,17 +54,9 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="packages.config" />
|
<Content Include="packages.config" />
|
||||||
<None Include="Web.Debug.config">
|
|
||||||
<DependentUpon>Web.config</DependentUpon>
|
|
||||||
</None>
|
|
||||||
<None Include="Web.Release.config">
|
|
||||||
<DependentUpon>Web.config</DependentUpon>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="Web.config" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Home2Controller.cs" />
|
||||||
<Compile Include="HomeController.cs" />
|
<Compile Include="HomeController.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Startup.cs" />
|
<Compile Include="Startup.cs" />
|
||||||
|
|
@ -75,6 +67,15 @@
|
||||||
<Name>Microsoft.AspNet.Mvc</Name>
|
<Name>Microsoft.AspNet.Mvc</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="web.config" />
|
||||||
|
<None Include="web.Debug.config">
|
||||||
|
<DependentUpon>web.config</DependentUpon>
|
||||||
|
</None>
|
||||||
|
<None Include="web.Release.config">
|
||||||
|
<DependentUpon>web.config</DependentUpon>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0"?>
|
||||||
<!--
|
|
||||||
For more information on how to configure your ASP.NET application, please visit
|
|
||||||
http://go.microsoft.com/fwlink/?LinkId=169433
|
|
||||||
-->
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<system.web>
|
|
||||||
<compilation debug="true" targetFramework="4.5" />
|
<system.web>
|
||||||
<httpRuntime targetFramework="4.5" />
|
<compilation debug="true" targetFramework="4.5" />
|
||||||
</system.web>
|
<httpRuntime targetFramework="4.5" />
|
||||||
</configuration>
|
</system.web>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue