为什么ASP.NET Core中的中间件需要特定的语义,而不是接口?

时间:2016-11-30 20:40:21

标签: interface asp.net-core owin middleware owin-middleware

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

public class FakeMiddleware
{

}

并注册:

    app.UseMiddleware<FakeMiddleware>();

我们会收到运行时错误。当然,这很简单,容易被发现和修复,但它实现得如此粗糙,没有界面?

2 个答案:

答案 0 :(得分:24)

Invoke方法非常灵活,您可以要求提供其他参数。 ASP.NET将使用应用程序的服务配置注入其他参数。

{{1}}

C#接口定义无法以一种很好的方式提供这种灵活性。

答案 1 :(得分:1)

Since 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>();
}