Middleware Invoke multi parameters (#288)

This commit is contained in:
tangdf 2018-03-21 14:33:22 +08:00 committed by Tom Pallister
parent 1e34ac3eec
commit c79f1ecbf8
2 changed files with 32 additions and 4 deletions

View File

@ -94,7 +94,7 @@ namespace Ocelot.Middleware.Pipeline
private static Func<T, DownstreamContext, IServiceProvider, Task> Compile<T>(MethodInfo methodinfo, ParameterInfo[] parameters) private static Func<T, DownstreamContext, IServiceProvider, Task> Compile<T>(MethodInfo methodinfo, ParameterInfo[] parameters)
{ {
var middleware = typeof(T); var middleware = typeof(T);
var httpContextArg = Expression.Parameter(typeof(HttpContext), "httpContext"); var httpContextArg = Expression.Parameter(typeof(DownstreamContext), "downstreamContext");
var providerArg = Expression.Parameter(typeof(IServiceProvider), "serviceProvider"); var providerArg = Expression.Parameter(typeof(IServiceProvider), "serviceProvider");
var instanceArg = Expression.Parameter(middleware, "middleware"); var instanceArg = Expression.Parameter(middleware, "middleware");
@ -111,8 +111,7 @@ namespace Ocelot.Middleware.Pipeline
var parameterTypeExpression = new Expression[] var parameterTypeExpression = new Expression[]
{ {
providerArg, providerArg,
Expression.Constant(parameterType, typeof(Type)), Expression.Constant(parameterType, typeof(Type))
Expression.Constant(methodinfo.DeclaringType, typeof(Type))
}; };
var getServiceCall = Expression.Call(GetServiceInfo, parameterTypeExpression); var getServiceCall = Expression.Call(GetServiceInfo, parameterTypeExpression);

View File

@ -1,4 +1,7 @@
namespace Ocelot.UnitTests.Middleware using System;
using System.Threading.Tasks;
namespace Ocelot.UnitTests.Middleware
{ {
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
@ -80,5 +83,31 @@
_counter.ShouldBe(1); _counter.ShouldBe(1);
_downstreamContext.HttpContext.Response.StatusCode.ShouldBe(404); _downstreamContext.HttpContext.Response.StatusCode.ShouldBe(404);
} }
[Fact]
public void Middleware_Multi_Parameters_Invoke()
{
var provider = _services.BuildServiceProvider();
IOcelotPipelineBuilder builder = new OcelotPipelineBuilder(provider);
builder = builder.UseMiddleware<MultiParametersInvokeMiddleware>();
var del = builder.Build();
_downstreamContext = new DownstreamContext(new DefaultHttpContext());
del.Invoke(_downstreamContext);
}
private class MultiParametersInvokeMiddleware : OcelotMiddleware
{
private readonly OcelotRequestDelegate _next;
public MultiParametersInvokeMiddleware(OcelotRequestDelegate next)
{
_next = next;
}
public Task Invoke(DownstreamContext context, IServiceProvider serviceProvider)
{
return Task.CompletedTask;
}
}
} }
} }