众所周知,ASP.NET Core中方法Configure(类Startup)的IApplicationBuilder需要特定的语义(使用HttpContext类型的输入参数和作为返回值的Task的方法'Invoke')。但为什么它没有作为接口实现?我可以写出类似的东西:
public class FakeMiddleware
{
}
并注册:
app.UseMiddleware<FakeMiddleware>();
我们会收到运行时错误。当然,这很简单,容易被发现和修复,但它实现得如此粗糙,没有界面?
答案 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>();
}