1. IStartupFilter
上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能点将将一系列相关中间件的注册封装到一起,从 Startup 类中分离,单独进行维护,以便更清晰地管理我们的代码。
这时候我们可以实现 IStartupFilter 接口,然后将其注入到容器之中,在应用启动的时候 IStartupFilter 实现类会被执行,从而完成对中间件的配置。
在 IStartupFilter 中配置的中间件,总是比 Startup 类中 Configure 方法中的中间件先注册;对于多个 IStartupFilter 实现,执行顺序与服务注册时的顺序相反
通过源码可以看到,ASP.NET Core 框架在创建应用的时候,会从容器中提取出所有的 IStartupFilter 的实现类,循环执行,然后再执行 Startup 类中的 Configure 方法。
下面是一个测试例子 :
点击查看代码
public class FirstStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
Console.WriteLine("FirstStartupFilter");
return app => next(app);
}
}
public class SecondStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
Console.WriteLine("SecondStartupFilter");
return app => next(app);
}
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
Console.WriteLine("Startup: ConfigureServices");
services.AddTransient<IStartupFilter, FirstStartupFilter>();
services.AddTransient<IStartupFilter, SecondStartupFilter>();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
Console.WriteLine("Startup.Configure");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting
app.UseAuthorization
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
执行结果如下:
2 IHostingStartup
第一次接触 IHostingStartup 的应用是在 Skywalking 的使用之中,当初觉得 Skywalking 仅仅通过配置一个环境变量就能集成相关的功能非常神奇,并不知道具体是怎么实现的。后面出于这点好奇心,了解了一下相关的原理,才知道原来是使用了 IHostingStartup 在启动时通过外部程序集向应用增加更多功能。
标签:Core,ASP,IStartupFilter,Configure,app,IHostingStartup,Startup,NET,public From: https://www.cnblogs.com/wewant/p/17103669.html