ASP.NET Core使用HostingStartup增强启动操作方法详解

在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup。如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉。我们常说AOP使用了关注点分离的方式,增强了对现有逻辑的操作。而我们今天要说的HostingStartup就是为了"增强"启动操作,这种"增强"的操作甚至可以对现有的程序可以做到无改动的操作。例如,外部程序集可通过HostingStartup实现为应用提供配置服务、注册服务或中间件管道操作等。

使用方式

HostingStartup属性表示要在运行时激活的承载启动程序集。大致分为两种情况,一种是自动扫描当前Web程序集中通过HostingStartup指定的类,另一种是手动添加配置hostingstartupassembles指定外部的程序集中通过HostingStartup指定的类。第一种方式相对简单,但是对Web程序本身有入侵,第二种方式稍微复杂一点点,但是可以做到对现有代码无入侵操作,接下来我们分别演示这两种使用方式。

ASP.NET Core中直接定义

首先是在ASP.NET Core程序中直接使用HostingStartup,这种方式比较简单首先在Web程序中随便定义一个类,然后实现IHostingStartup接口,最后别忘了在程序集中添加HostingStartupAttribute指定要启动的类的类型,具体代码如下所示

using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; //通过HostingStartup指定要启动的类型 [assembly: HostingStartup(typeof(HostStartupWeb.HostingStartupInWeb))] namespace HostStartupWeb { public class HostingStartupInWeb : IHostingStartup { public void Configure(IWebHostBuilder builder) { //程序启动时打印依据话,代表执行到了这里 Debug.WriteLine("Web程序中HostingStartupInWeb类启动"); //可以添加配置 builder.ConfigureAppConfiguration(config => { //模拟添加一个一个内存配置 var datas = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("ServiceName", "HostStartupWeb") }; config.AddInMemoryCollection(datas); }); //可以添加ConfigureServices builder.ConfigureServices(services=> { //模拟注册一个PersonDto services.AddScoped(provider=>new PersonDto { Id = 1, Name = "yi念之间", Age = 18 }); }); //可以添加Configure builder.Configure(app => { //模拟添加一个中间件 app.Use(async (context, next) => { await next(); }); }); } } }

仅仅使用上面所示的这些代码,便可在Web程序启动的时候去自动执行HostingStartupInWeb的Configure方法,在这里面我们几乎可以使用所有针对ASP.NET Core程序配置的操作,而且不需要在Web程序中额外添加别的代码就可以自动调用HostingStartupInWeb的Configure方法。

外部程序集引入

我们之前也说过,上面的方式虽然使用起来相对简单一点,仅仅是一点,那就是省去了指定启动程序集的逻辑。但是,上面的方式需要在Web程序中添加,这样的话还是会修改代码。而且,可能更多的时候我们是在外部的程序集中编写HostingStartup逻辑,这时候就需要使用另一种方式在将外部程序集中引入HostingStartup。首先我们要在自定义的程序集中至少引入Microsoft.AspNetCore.Hosting包才能使用HostingStartup

<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />

如果你不需要使用注册中间件的逻辑那么仅仅引入Microsoft.AspNetCore.Hosting.Abstractions即可

<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />

如果需要使用其他功能包,可以自行在定义的程序集中引入。比如我们定义了一个名为HostStartupLib的Standard类库,并创建了名为HostStartupLib的类

using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; [assembly: HostingStartup(typeof(HostStartupLib.HostingStartupInLib))] namespace HostStartupLib { public class HostingStartupInLib : IHostingStartup { public void Configure(IWebHostBuilder builder) { Debug.WriteLine("Lib程序中HostingStartupInLib类启动"); //添加配置 builder.ConfigureAppConfiguration((context, config) => { var datas = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("ServiceName", "HostStartupLib") }; config.AddInMemoryCollection(datas); }); //添加ConfigureServices builder.ConfigureServices(services=> { services.AddScoped(provider=>new PersonDto { Id = 2, Name = "er念之间", Age = 19 }); }); //添加Configure builder.Configure(app => { app.Use(async (context, next) => { await next(); }); }); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wswssp.html