网站内容架构,抖音seo什么意思,做网站颜色黑色代码多少,汽车美容网站模板ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离#xff0c;但是有些时候我们还会可以根据应用中的功能… ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离但是有些时候我们还会可以根据应用中的功能点将一系列相关中间件的注册封装到一起从 Startup 类中分离单独进行维护以便更清晰地管理我们的代码。 这时候我们可以实现 IStartupFilter 接口然后将其注入到容器之中在应用启动的时候 IStartupFilter 实现类会被执行从而完成对中间件的配置。 在 IStartupFilter 中配置的中间件总是比 Startup 类中 Configure 方法中的中间件先注册对于多个 IStartupFilter 实现执行顺序与服务注册时的顺序相反 通过源码可以看到ASP.NET Core 框架在创建应用的时候会从容器中提取出所有的 IStartupFilter 的实现类循环执行然后再执行 Startup 类中的 Configure 方法。 下面是一个测试例子
public class FirstStartupFilter : IStartupFilter
{public ActionIApplicationBuilder Configure(ActionIApplicationBuilder next){Console.WriteLine(FirstStartupFilter);return app next(app);}
}public class SecondStartupFilter : IStartupFilter
{public ActionIApplicationBuilder Configure(ActionIApplicationBuilder 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.AddTransientIStartupFilter, FirstStartupFilter();services.AddTransientIStartupFilter, 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.UseRoutingapp.UseAuthorizationapp.UseEndpoints(endpoints {endpoints.MapControllers();});}
}
执行结果如下
2 IHostingStartup 第一次接触 IHostingStartup 的应用是在 Skywalking 的使用之中当初觉得 Skywalking 仅仅通过配置一个环境变量就能集成相关的功能非常神奇并不知道具体是怎么实现的。后面出于这点好奇心了解了一下相关的原理才知道原来是使用了 IHostingStartup 在启动时通过外部程序集向应用增加更多功能它是 ASP.NETCore 框架原生提供的一种进行模块化开发的方式使用它必须通过 Web 主机调用 ConfigureWebHost、ConfigureWebHostDefaults 配置方法。
通过源码可以看到在调用 Build 方法构建主机的时候会获取外部程序集名称然后将其加载再通过HostingStartupAttribute 程序集特性找到配置的 HostingStartType该类需要实现 IHostingStartup 接口之后反射生成实例调用其中的 Configure 方法传入 IWebHostBuider 对象因此在 IHostingStartup 实现类中一样可以进行依赖注入、管道配置。 再看怎么获取外部程序集名称的 可以看到是从配置系统中获取的而 key 是 WebHostDefaults.HostingStartupAssembliesKey 常量也就是 hostingStartupAssemblies由于这里是 主机配置所以我们可以通过 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 进行设置Web 主机在加载环境变量的时候会截去前缀 ASPNETCORE_ 配置系统中 key 不区分大小写。 下面看看如何使用 IHostingStartup
2.5.1 创建外部程序集
首先我们创建 HostingStartup 程序集可以通过创建类库项目或无入口点的控制台应用来实现。 之后创建一个 IHostingStartup 接口的实现类
[assembly: HostingStartup(typeof(MyHostingStartup))]
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 外部程序集之后我们在主体应用项目中可以这样进行激活。
首先将该程序集应用进项目之中: 然后向配置系统中设置外部程序集的名称以实现在构建主机的时候进行加载由于是主机配置所以我们可以通过几种方式进行设置
(1) 在构建主机的时候进行配置
public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder {webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey,HostingStartupLib).UseStartupStartup();});其实这里的 UseSetting 方法就是就是往配置系统中添加配置而已 (2) 通过环境变量进行设置
Web主机在启动的时候会通过环境变量提供程序获取环境变量作为主机配置并且会在写入配置系统的时候会截取掉 ASPNET_ 前缀我们在配置的时候要用 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 作为 key。这种无需侵入程序代码是更为推荐的方式。
我们可以直接在机器的环境变量列表中配置但是如果只是开发环境的话也可以通过 launchSettings.json 。 无论是那种配置方式如果需要同时激活多个外部程序集可以用英文逗号 ; 分隔。除了 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 环境变量之外和外部程序集有关的配置还有 ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES用于排除要激活的程序集ASPNETCORE_PREVENTHOSTINGSTARTUP用于配置是否禁止外部程序集。 参考文章
官方文档-托管启动程序集 理解ASP.NET Core - Startup ASP.NET Core 系列总结
目录ASP.NET Core 系列总结 上一篇ASP.NET Core — 入口文件 下一篇ASP.NET Core - .NET 6 的入口文件