Skip to content

Commit

Permalink
[#227] [edit] switch to dictionary from dynamic on all places for con…
Browse files Browse the repository at this point in the history
…trollers v2
  • Loading branch information
i4004 committed Jan 20, 2024
1 parent 9da2bde commit 696f07c
Show file tree
Hide file tree
Showing 9 changed files with 87 additions and 77 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Simplify.DI;
Expand All @@ -9,6 +10,6 @@ namespace Simplify.Web.RegistrationsTests.CustomTypes;

public class CustomControllerExecutor : IControllerExecutor
{
public Task<ControllerResponseResult> Execute(IControllerMetaData controllerMetaData, IDIResolver resolver, HttpContext context, dynamic? routeParameters = null) =>
public Task<ControllerResponseResult> Execute(IControllerMetaData controllerMetaData, IDIResolver resolver, HttpContext context, IDictionary<string, object>? routeParameters = null) =>
throw new NotImplementedException();
}
45 changes: 33 additions & 12 deletions src/Simplify.Web.Tests/Routing/RouteMatcherTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Simplify.Web.Tests.Routing;
[TestFixture]
public class RouteMatcherTests
{
private IRouteMatcher _matcher = null!;
private RouteMatcher _matcher = null!;
private Mock<IControllerPathParser> _controllerPathParser = null!;

[SetUp]
Expand Down Expand Up @@ -117,12 +117,14 @@ public void Match_TwoSegmentsWithSegmentAndParameter_TrueValueParsed()
.Returns(new ControllerPath(new List<PathItem> { new PathSegment("user"), new PathParameter("userName", typeof(string)) }));

// Act

var result = _matcher.Match("/user/testuser", "/user/{userName}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual("testuser", result.RouteParameters!.userName);
Assert.AreEqual("testuser", routeParameters.userName);
}

[Test]
Expand Down Expand Up @@ -168,12 +170,14 @@ public void Match_OneSegmentWithOneParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("userName", typeof(string)) }));

// Act

var result = _matcher.Match("/user", "/{userName}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual("user", result.RouteParameters!.userName);
Assert.AreEqual("user", routeParameters.userName);
}

[Test]
Expand All @@ -198,12 +202,15 @@ public void Match_TwoSegmentsWithTwoParameters_TrueParsed()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("test", typeof(string)), new PathParameter("name", typeof(string)) }));

// Act

var result = _matcher.Match("/foo/bar", "/{test}/{name}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual("foo", result.RouteParameters!.test);
Assert.AreEqual("bar", result.RouteParameters.name);
Assert.AreEqual("foo", routeParameters.test);
Assert.AreEqual("bar", routeParameters.name);
}

[Test]
Expand All @@ -214,12 +221,14 @@ public void Match_OneSegmentWithOneIntegerParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("id", typeof(int)) }));

// Act

var result = _matcher.Match("/15", "/{id}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual(15, result.RouteParameters!.id);
Assert.AreEqual(15, routeParameters.id);
}

[Test]
Expand All @@ -230,12 +239,14 @@ public void Match_OneSegmentWithOneDecimalParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("id", typeof(decimal)) }));

// Act

var result = _matcher.Match("/15", "/{id}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual((decimal)15, result.RouteParameters!.id);
Assert.AreEqual((decimal)15, routeParameters.id);
}

[Test]
Expand All @@ -246,12 +257,14 @@ public void Match_BoolParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("foo", typeof(bool)) }));

// Act

var result = _matcher.Match("/true", "/{foo:bool}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);
Assert.AreEqual(true, result.RouteParameters!.foo);
Assert.AreEqual(true, routeParameters.foo);
}

[Test]
Expand All @@ -262,13 +275,15 @@ public void Match_StringArrayShortVersionParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("foo", typeof(string[])) }));

// Act

var result = _matcher.Match("/hello,world,test", "/{foo:[]}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);

var items = (IList<string>)result.RouteParameters!.foo;
var items = (IList<string>)routeParameters.foo;

Assert.AreEqual(3, items.Count);
Assert.AreEqual("hello", items[0]);
Expand All @@ -284,13 +299,15 @@ public void Match_IntArrayShortVersionParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("foo", typeof(int[])) }));

// Act

var result = _matcher.Match("/1,2,3", "/{foo:int[]}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);

var items = (IList<int>)result.RouteParameters!.foo;
var items = (IList<int>)routeParameters.foo;

Assert.AreEqual(3, items.Count);
Assert.AreEqual(1, items[0]);
Expand All @@ -306,13 +323,15 @@ public void Match_DecimalArrayShortVersionParameter_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("foo", typeof(decimal[])) }));

// Act

var result = _matcher.Match("/1,2,3", "/{foo:decimal[]}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);

var items = (IList<decimal>)result.RouteParameters!.foo;
var items = (IList<decimal>)routeParameters.foo;

Assert.AreEqual(3, items.Count);
Assert.AreEqual(1, items[0]);
Expand All @@ -328,13 +347,15 @@ public void Match_BoolArrayShortVersionParameterWithTypeMismatch_True()
.Returns(new ControllerPath(new List<PathItem> { new PathParameter("foo", typeof(bool[])) }));

// Act

var result = _matcher.Match("/true,false,asdasd", "/{foo:bool[]}");
var routeParameters = (dynamic)result.RouteParameters!;

// Assert

Assert.IsTrue(result.Success);

var items = (IList<bool>)result.RouteParameters!.foo;
var items = (IList<bool>)routeParameters.foo;

Assert.AreEqual(2, items.Count);
Assert.AreEqual(true, items[0]);
Expand Down
32 changes: 13 additions & 19 deletions src/Simplify.Web/Core/Controllers/ControllersProcessor.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Simplify.DI;
using Simplify.Web.Core.Controllers.Execution;
Expand All @@ -10,24 +11,17 @@ namespace Simplify.Web.Core.Controllers;
/// <summary>
/// Provides controllers processor
/// </summary>
public class ControllersProcessor : IControllersProcessor
/// <remarks>
/// Initializes a new instance of the <see cref="ControllersProcessor" /> class.
/// </remarks>
/// <param name="controllersAgent">The controllers agent.</param>
/// <param name="controllerExecutor">The controller executor.</param>
/// <param name="redirector">The redirector.</param>
public class ControllersProcessor(IControllersAgent controllersAgent, IControllerExecutor controllerExecutor, IRedirector redirector) : IControllersProcessor
{
private readonly IControllersAgent _agent;
private readonly IControllerExecutor _controllerExecutor;
private readonly IRedirector _redirector;

/// <summary>
/// Initializes a new instance of the <see cref="ControllersProcessor" /> class.
/// </summary>
/// <param name="controllersAgent">The controllers agent.</param>
/// <param name="controllerExecutor">The controller executor.</param>
/// <param name="redirector">The redirector.</param>
public ControllersProcessor(IControllersAgent controllersAgent, IControllerExecutor controllerExecutor, IRedirector redirector)
{
_agent = controllersAgent;
_controllerExecutor = controllerExecutor;
_redirector = redirector;
}
private readonly IControllersAgent _agent = controllersAgent;
private readonly IControllerExecutor _controllerExecutor = controllerExecutor;
private readonly IRedirector _redirector = redirector;

/// <summary>
/// Process controllers for current HTTP request
Expand Down Expand Up @@ -76,7 +70,7 @@ public async Task<ControllersProcessorResult> ProcessControllers(IDIResolver res
return ControllersProcessorResult.Ok;
}

private async Task<ControllersProcessorResult> ProcessController(IControllerMetaData controller, IDIResolver resolver, HttpContext context, dynamic routeParameters)
private async Task<ControllersProcessorResult> ProcessController(IControllerMetaData controller, IDIResolver resolver, HttpContext context, IDictionary<string, object>? routeParameters)
{
var result = await _controllerExecutor.Execute(controller, resolver, context, routeParameters);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Simplify.DI;
using Simplify.Web.Core.AccessorsBuilding;
Expand All @@ -19,7 +20,7 @@ public class ControllerFactory : ActionModulesAccessorBuilder, IControllerFactor
/// <param name="routeParameters">The route parameters.</param>
/// <returns></returns>
public ControllerBase CreateController(Type controllerType, IDIResolver resolver, HttpContext context,
dynamic? routeParameters = null)
IDictionary<string, object>? routeParameters = null)
{
var controller = (ControllerBase)resolver.Resolve(controllerType);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Simplify.DI;

Expand All @@ -17,5 +18,5 @@ public interface IControllerFactory
/// <param name="context">The context.</param>
/// <param name="routeParameters">The route parameters.</param>
/// <returns></returns>
ControllerBase CreateController(Type controllerType, IDIResolver resolver, HttpContext context, dynamic? routeParameters = null);
ControllerBase CreateController(Type controllerType, IDIResolver resolver, HttpContext context, IDictionary<string, object>? routeParameters = null);
}
42 changes: 17 additions & 25 deletions src/Simplify.Web/Core/Controllers/Execution/ControllerExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,15 @@ namespace Simplify.Web.Core.Controllers.Execution;
/// <summary>
/// Provides controller executor, handles creation and execution of controllers
/// </summary>
public class ControllerExecutor : IControllerExecutor
/// <remarks>
/// Initializes a new instance of the <see cref="ControllerExecutor"/> class.
/// </remarks>
/// <param name="controllerFactory">The controller factory.</param>
/// <param name="controllerResponseBuilder">The controller response builder.</param>
public class ControllerExecutor(IControllerFactory controllerFactory, IControllerResponseBuilder controllerResponseBuilder) : IControllerExecutor
{
private readonly IControllerFactory _controllerFactory;
private readonly IControllerResponseBuilder _controllerResponseBuilder;

private readonly IList<Task<ControllerResponse>> _controllersResponses = new List<Task<ControllerResponse>>();

/// <summary>
/// Initializes a new instance of the <see cref="ControllerExecutor"/> class.
/// </summary>
/// <param name="controllerFactory">The controller factory.</param>
/// <param name="controllerResponseBuilder">The controller response builder.</param>
public ControllerExecutor(IControllerFactory controllerFactory, IControllerResponseBuilder controllerResponseBuilder)
{
_controllerFactory = controllerFactory;
_controllerResponseBuilder = controllerResponseBuilder;
}
private readonly IControllerFactory _controllerFactory = controllerFactory;
private readonly IControllerResponseBuilder _controllerResponseBuilder = controllerResponseBuilder;

/// <summary>
/// Creates and executes the specified controller.
Expand All @@ -37,24 +29,24 @@ public ControllerExecutor(IControllerFactory controllerFactory, IControllerRespo
/// <param name="routeParameters">The route parameters.</param>
/// <returns></returns>
public async Task<ControllerResponseResult> Execute(IControllerMetaData controllerMetaData, IDIResolver resolver, HttpContext context,
dynamic? routeParameters = null)
IDictionary<string, object>? routeParameters = null)
{
ControllerResponse? response = null;
var controller = _controllerFactory.CreateController(controllerMetaData.ControllerType, resolver, context, routeParameters);

switch (controller)
{
case SyncControllerBase syncController:
{
response = syncController.Invoke();
break;
}
{
response = syncController.Invoke();
break;
}

case AsyncControllerBase asyncController:
{
response = await asyncController.Invoke();
break;
}
{
response = await asyncController.Invoke();
break;
}
}

if (response == null)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Simplify.DI;
using Simplify.Web.Meta;
Expand All @@ -19,5 +20,5 @@ public interface IControllerExecutor
/// <param name="routeParameters">The route parameters.</param>
/// <returns></returns>
Task<ControllerResponseResult> Execute(IControllerMetaData controllerMetaData, IDIResolver resolver, HttpContext context,
dynamic? routeParameters = null);
IDictionary<string, object>? routeParameters = null);
}
6 changes: 4 additions & 2 deletions src/Simplify.Web/Routing/IRouteMatchResult.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Simplify.Web.Routing;
using System.Collections.Generic;

namespace Simplify.Web.Routing;

/// <summary>
/// Represent HTTP route matching result
Expand All @@ -19,5 +21,5 @@ public interface IRouteMatchResult
/// <value>
/// The route parsed parameters.
/// </value>
dynamic? RouteParameters { get; }
IDictionary<string, object>? RouteParameters { get; }
}
Loading

0 comments on commit 696f07c

Please sign in to comment.