设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > Asp教程 > 正文

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

发布时间:2020-12-10 09:52 所属栏目:120 来源:网络整理
导读:这篇文章主要介绍了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(); }); }); } } }

然后我们将自定义的HostStartupLib这个Standard类库引入Web项目中,运行Web程序,发现HostingStartupInLib的Configure方法并不能被调用。其实我们上面说过了,将HostingStartup从外部程序集引入的话需要手动指定启动程序集的名称。指定启动程序集的方式有两种,一种是指定IWebHostBuilder的扩展UseSetting指定

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { //通过UseSetting的方式指定程序集的名称 webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostStartupLib"); //如果HostingStartup存在多个程序集中可以使用;分隔,比如HostStartupLib;HostStartupLib2 //webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostStartupLib;HostStartupLib2"); webBuilder.UseStartup<Startup>(); });

另一种通过添加环境变量ASPNETCORE_HOSTINGSTARTUPASSEMBLIES的方式,可以通过设置launchSettings.json中

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读