当程序启动时,会自动扫描入口程序集和配置的待激活的的程序集列表(参见下方:激活HostingStarup程序集),来找到所有的HostingStartup特性,并通过反射的方式创建Startup并调用Configure方法。
using SkyApm.Agent.AspNetCore; [assembly: HostingStartup(typeof(SkyApmHostingStartup))] namespace SkyApm.Agent.AspNetCore { internal class SkyApmHostingStartup : IHostingStartup { public void Configure(IWebHostBuilder builder) { builder.ConfigureServices(services => services.AddSkyAPM(ext => ext.AddAspNetCoreHosting())); } } }
激活HostingStarup程序集要激活HostingStarup程序集,我们有两种配置方式:
1.使用环境变量(推荐)使用环境变量,无需侵入程序代码,所以我更推荐大家使用这种方式。
配置环境变量ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,多个程序集使用分号(;)进行分隔,用于添加要激活的程序集。变量WebHostDefaults.HostingStartupAssembliesKey就是指代这个环境变量的Key。
另外,还有一个环境变量,叫做ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES,多个程序集使用分号(;)进行分隔,用于排除要激活的程序集。变量WebHostDefaults.HostingStartupExcludeAssembliesKey就是指代这个环境变量的Key。
我们在 launchSettings.json 中添加两个程序集:
"environmentVariables": { "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore;HostingStartupLibrary" }
2.在程序中配置public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseSetting( WebHostDefaults.HostingStartupAssembliesKey, "SkyAPM.Agent.AspNetCore;HostingStartupLibrary") .UseStartup<Startup>(); });
这样就配置完成了,很🐮🍺的一个功能点吧!
需要注意的是,无论使用哪种配置方式,当存在多个HostingStartup程序集时,将按配置这些程序集时的书写顺序执行 Configure方法。
多环境配置一款软件,一般要经过需求分析、设计编码,单元测试、集成测试以及系统测试等一系列测试流程,验收,最终上线。那么,就至少需要4套环境来保证系统运行:
Development:开发环境,用于开发人员在本地对应用进行调试运行
Test:测试环境,用于测试人员对应用进行测试
Staging:预发布环境,用于在正式上线之前,对应用进行集成、测试和预览,或用于验收
Production:生产环境,应用的正式线上环境
环境配置方式通过环境变量ASPNETCORE_ENVIRONMENT指定运行环境
注意:如果未指定环境,默认情况下,为 Production
在项目的Properties文件夹里面,有一个“launchSettings.json”文件,该文件是用于配置VS中项目启动的。
接下来我们就在launchSettings.json中配置一下。
先解释一下该文件中出现的几个参数:
commandName:指定要启动的Web服务器,有三个可选值:
Project:启动 Kestrel
IISExpress:启动IIS Express
IIS:不启用任何Web服务器,使用IIS
{ "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { // 如果不指定profile,则默认选择第一个 // Development "ASP.NET.WebAPI": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, // Test "ASP.NET.WebAPI.Test": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Test" } }, // Staging "ASP.NET.WebAPI.Staging": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Staging" } }, // Production "ASP.NET.WebAPI.Production": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Production" } }, // 用于测试在未指定环境时,默认是否为Production "ASP.NET.WebAPI.Default": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "http://localhost:5000" } } }
配置完成后,就可以在VS上方工具栏中的项目启动处选择启动项了
基于环境的 StartupStartup类支持针对不同环境进行个性化配置,有三种方式:
1.将IWebHostEnvironment注入 Startup 类
2.Startup 方法约定
3.Startup 类约定
1.将IWebHostEnvironment注入 Startup 类通过将IWebHostEnvironment注入 Startup 类,然后在方法中使用条件判断书写不同环境下的代码。该方式适用于多环境下,代码差异较少的情况。