36

众所周知,ASP.NET Core 中的 Configure(类 Startup)方法的 IApplicationBuilder 需要特定的语义(让方法 'Invoke' 具有 HttpContext 类型的输入参数和 Task 作为返回值)。但是为什么它没有作为接口实现呢?我可以写类似的东西:

public class FakeMiddleware
{

}

并注册它:

    app.UseMiddleware<FakeMiddleware>();

我们会得到一个运行时错误。当然,这是一件小事,容易被发现和修复,但它实现得如此粗糙,没有接口?

4

2 回答 2

33

Invoke 方法很灵活,您可以要求额外的参数。ASP.NET 将使用应用程序的服务配置注入附加参数。

public async Task Invoke(HttpContext ctx, 
                         IHostingEnvironment host,
                         ISomethingElse service)
{
    // ...
}

C# 接口定义不能很好地提供这种灵活性。

于 2016-11-30T21:18:39.610 回答
3

从 AspNetCore2.0 开始,您可以设置实现接口 IMiddleware 的中间件。

public class InterfaceMiddleware : IMiddleware
{
    private InterfaceMiddlewareOptions _opts;

    public InterfaceMiddleware(IOptions<InterfaceMiddlewareOptions> opts)
    {
        _opts = opts.Value;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        await context.Response.WriteAsync(_opts.Message);
    }
}

除了app.UseMiddleware<InterfaceMiddleware>(). 您需要在 DI 中注册您的中间件(不需要单例生命周期)。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<InterfaceMiddlewareOptions>(opts =>
    {
        opts.Message = "IMiddleware interface is implemented";
    });

    services.AddSingleton<InterfaceMiddleware>();
}
于 2020-11-04T10:07:02.723 回答