ASP.NET Core - IStartupFilter 与 IHostingStartup
1. IStartupFilter上面讲到的方式虽然能够根据差别环境将Startup中的启动逻辑举行分离,但是有些时间我们还会可以根据应用中的功能点将一系列相关中心件的注册封装到一起,从 Startup 类中分离,单独举行维护,以便更清晰地管理我们的代码。
这时间我们可以实现 IStartupFilter 接口,然后将其注入到容器之中,在应用启动的时间 IStartupFilter 实现类会被执行,从而完成对中心件的配置。
在 IStartupFilter 中配置的中心件,总是比 Startup 类中 Configure 方法中的中心件先注册;对于多个 IStartupFilter 实现,执行次序与服务注册时的次序相反
通过源码可以看到,ASP.NET Core 框架在创建应用的时间,会从容器中提取出所有的 IStartupFilter 的实现类,循环执行,然后再执行 Startup 类中的 Configure 方法。
https://i-blog.csdnimg.cn/direct/06a8ce2d21f64b4f99a9d65e27bcf29c.png
下面是一个测试例子 :
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();
});
}
}
执行结果如下:
https://i-blog.csdnimg.cn/direct/531a8f7e6df2492994895fabb16b5dba.png
2 IHostingStartup
第一次接触 IHostingStartup 的应用是在 Skywalking 的使用之中,当初觉得 Skywalking 仅仅通过配置一个环境变量就能集成相关的功能非常神奇,并不知道详细是怎么实现的。后面出于这点好奇心,了解了一下相关的原理,才知道原来是使用了 IHostingStartup 在启动时通过外部程序集向应用增加更多功能,它是 ASP.NETCore 框架原生提供的一种举行模块化开辟的方式,使用它必须通过 Web 主机调用 ConfigureWebHost、ConfigureWebHostDefaults 配置方法。
通过源码可以看到,在调用 Build 方法构建主机的时间会获取外部程序集名称,然后将其加载,再通过HostingStartupAttribute 程序集特性找到配置的 HostingStartType,该类必要实现 IHostingStartup 接口,之后反射生成实例,调用其中的 Configure 方法,传入 IWebHostBuider 对象,因此在 IHostingStartup 实现类中一样可以举行依赖注入、管道配置。
https://i-blog.csdnimg.cn/direct/e817f87219534c948e5b47b34c4fd904.png
https://i-blog.csdnimg.cn/direct/dd449c1be58240baa83dde0374da5628.png
再看怎么获取外部程序集名称的:
https://i-blog.csdnimg.cn/direct/cc2ed68a61ac4c8eb71878f16d0f1b3f.png
https://i-blog.csdnimg.cn/direct/8f134113ceca4da3a594ef1ebd5c3e43.png
可以看到是从配置系统中获取的,而 key 是 WebHostDefaults.HostingStartupAssembliesKey 常量,也就是 hostingStartupAssemblies,由于这里是 主机配置,所以我们可以通过 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 举行设置,Web 主机在加载环境变量的时间会截去前缀 ASPNETCORE_ ,配置系统中 key 不区分巨细写。
https://i-blog.csdnimg.cn/direct/1dfa8a745dc64bb0930966d20d16bf6a.png
下面看看怎样使用 IHostingStartup:
2.5.1 创建外部程序集
起首我们创建 HostingStartup 程序集,可以通过创建类库项目或无入口点的控制台应用来实现。
https://i-blog.csdnimg.cn/direct/6c82d3c50727452d895ed97474d81e7e.png
之后创建一个 IHostingStartup 接口的实现类
namespace HostingStartupLib
{
public class MyHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
builder.ConfigureServices(services => { })
.ConfigureAppConfiguration(app => { });
Console.WriteLine("Init External Amsebly!");
}
}
}
该类的 Configure 方法中入参为 IWebHostBuilder ,通过 IWebHostBuilder 来添加增强功能,像 Program.cs 文件中对主机举行配置一样。
之后,必要配置 HostingStartup 特性,这是一个程序集特性,指定当出息序集的 IHostingStartup 实现类范例。
2.5.2 激活外部程序集
有了一个这样的 HostingStartup 外部程序集之后,我们在主体应用项目中可以这样举行激活。
起首,将该程序集应用进项目之中:
https://i-blog.csdnimg.cn/direct/cffc6aefe6844272a9702b143a5606a3.png
然后,向配置系统中设置外部程序集的名称,以实如今构建主机的时间举行加载,由于是主机配置,所以我们可以通过几种方式举行设置:
(1) 在构建主机的时间举行配置
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseSetting(
WebHostDefaults.HostingStartupAssembliesKey,
"HostingStartupLib")
.UseStartup<Startup>();
});
其实这里的 UseSetting 方法就是就是往配置系统中添加配置而已
https://i-blog.csdnimg.cn/direct/d5dfd138585f4e92a7c65b4fe9ab2f01.png
(2) 通过环境变量举行设置
Web主机在启动的时间会通过环境变量提供程序获取环境变量作为主机配置,并且会在写入配置系统的时间会截取掉 ASPNET_ 前缀,我们在配置的时间要用 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 作为 key。这种无需侵入程序代码,是更为保举的方式。
我们可以直接在机器的环境变量列表中配置,但是假如只是开辟环境的话也可以通过 launchSettings.json 。
https://i-blog.csdnimg.cn/direct/b99d04aa73054555b36d8225ef915f58.png
无论是那种配置方式,假如必要同时激活多个外部程序集可以用英文逗号 ; 分隔。除了 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 环境变量之外,和外部程序集有关的配置还有 ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES,用于清除要激活的程序集,ASPNETCORE_PREVENTHOSTINGSTARTUP,用于配置是否克制外部程序集。
参考文章:
官方文档-托管启动程序集
理解ASP.NET Core - Startup
ASP.NET Core 系列总结:
目录:ASP.NET Core 系列总结
上一篇:ASP.NET Core — 入口文件
下一篇:ASP.NET Core - .NET 6 的入口文件
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]