如何在HostingStartup中注册中间件



背景

我希望通过注册插件来添加额外的中间件,而不更改原始项目代码,但如何获得在插件中注册中间件所需的IApplicationBuilder是我目前面临的最大问题
根据托管启动文档,插件可以通过继承IHostingStartup进行注册,并在项目启动时自动加载,例如:

// plugin
public class MyStartup: IHostingStartup
{
// Implement the IHostingStartup interface
public void Configure(IWebHostBuilder builder)
{
// TODO: I want to get an IApplicationBuilder object to register middleware
}
}

问题

如何通过IWebHostBuilder获取IApplicationBuilder对象?

在官方文档中,用启动过滤器扩展启动解释了IStartupFilter在这里可能有用:

使用IStartupFilter在应用程序的Configure中间件管道的开始或结束处配置中间件,而无需显式调用Use{Middleware}

下面是一个示例实现:

public class MyStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return app =>
{
app.UseMiddleware<MyMiddleware>();
next(applicationBuilder);
};
}
}

在本例中,我们将MyMiddleware添加到管道的开始,这意味着它在管道的剩余部分之前运行。要在管道的运行MyMiddleware,请切换app.UseMiddlewarenext的顺序。

您还必须向DI容器注册此实现,如下所示:

// plugin
public class MyStartup : IHostingStartup
{
// Implement the IHostingStartup interface
public void Configure(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
services.AddTransient<IStartupFilter, MyStartupFilter>();
});
}
}

虽然这是有效的,但它并不像你需要的那样灵活。例如,它不允许你在应用程序添加的中间件之间注入中间件

最新更新