首页 > 编程语言 >ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup

时间:2023-02-12 10:00:56浏览次数:55  
标签:Core ASP IStartupFilter 配置 app IHostingStartup 程序 NET public

1. IStartupFilter

  上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能点将将一系列相关中间件的注册封装到一起,从 Startup 类中分离,单独进行维护,以便更清晰地管理我们的代码。

  这时候我们可以实现 IStartupFilter 接口,然后将其注入到容器之中,在应用启动的时候 IStartupFilter 实现类会被执行,从而完成对中间件的配置。

  在 IStartupFilter 中配置的中间件,总是比 Startup 类中 Configure 方法中的中间件先注册;对于多个 IStartupFilter 实现,执行顺序与服务注册时的顺序相反

  通过源码可以看到,ASP.NET Core 框架在创建应用的时候,会从容器中提取出所有的 IStartupFilter 的实现类,循环执行,然后再执行 Startup 类中的 Configure 方法。

image

下面是一个测试例子 :

点击查看代码
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();
        });
    }
}

执行结果如下:
image

2 IHostingStartup

  第一次接触 IHostingStartup 的应用是在 Skywalking 的使用之中,当初觉得 Skywalking 仅仅通过配置一个环境变量就能集成相关的功能非常神奇,并不知道具体是怎么实现的。后面出于这点好奇心,了解了一下相关的原理,才知道原来是使用了 IHostingStartup 在启动时通过外部程序集向应用增加更多功能,它是 ASP.NETCore 框架原生提供的一种进行模块化开发的方式,使用它必须通过 Web 主机调用 ConfigureWebHost、ConfigureWebHostDefaults
配置方法。

通过源码可以看到,在调用 Build 方法构建主机的时候会获取外部程序集名称,然后将其加载,再通过HostingStartupAttribute 程序集特性找到配置的 HostingStartType,该类需要实现 IHostingStartup 解析,之后反射生成实例,调用其中的 Configure 方法,传入的时候 IWebHostBuider 对象,因此在 IHostingStartup 实现类中一样可以进行依赖注入、管道配置。

image

image

再看怎么获取外部程序集名称的:
image

image

可以看到是从配置系统中获取的,而 key 是 WebHostDefaults.HostingStartupAssembliesKey 常量,也就是 hostingStartupAssemblies,由于这里是 主机配置,所以我们可以通过 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 进行设置,Web 主机在加载环境变量的时候会截去前缀 ASPNETCORE_ ,配置系统中 key 不区分大小写。

image

下面看看如何使用 IHostingStartup:

2.5.1 创建外部程序集

首先我们创建 HostingStartup 程序集,可以通过创建类库项目或无入口点的控制台应用来实现。

image
之后创建一个 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 外部程序集之后,我们在主体应用项目中可以这样进行激活。

首先,将该程序集应用进项目之中
image

然后,向配置系统中设置外部程序集的名称,以实现在构建主机的时候进行加载,由于是主机配置,所以我们可以通过几种方式进行设置:

(1) 在构建主机的时候进行配置

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseSetting(
                WebHostDefaults.HostingStartupAssembliesKey,
                "HostingStartupLib")
            .UseStartup<Startup>();
        });

其实这里的 UseSetting 方法就是就是往配置系统中添加配置而已

image

(2) 通过环境变量进行设置

Web主机在启动的时候会通过环境变量提供程序获取环境变量作为主机配置,并且会在写入配置系统的时候会截取掉 ASPNET_ 前缀,我们在配置的时候要用 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 作为 key。这种无需侵入程序代码,是更为推荐的方式。

我们可以直接在机器的环境变量列表中配置,但是如果只是开发环境的话也可以通过 launchSettings.json 。

image

无论是那种配置方式,如果需要同时可以用英文逗号 ; 分隔。除了 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 环境变量之外,和外部程序集有关的配置还有 ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES,用于排除要激活的程序集,ASPNETCORE_PREVENTHOSTINGSTARTUP,用于配置是否禁止外部程序集。



参考文章:

官方文档-托管启动程序集
理解ASP.NET Core - Startup



ASP.NET Core 系列总结:

目录:ASP.NET Core 系列总结
上一篇:ASP.NET Core—入口文件

标签:Core,ASP,IStartupFilter,配置,app,IHostingStartup,程序,NET,public
From: https://www.cnblogs.com/wewant/p/17107315.html

相关文章

  • 深入解读.NET MAUI音乐播放器项目(一):概述与架构
    系列文章将分步解读音乐播放器核心业务及代码:深入解读.NETMAUI音乐播放器项目(一):概述与架构深入解读.NETMAUI音乐播放器项目(二):播放内核深入解读.NETMAUI音乐播放器项......
  • 深入解读.NET MAUI音乐播放器项目(二):播放内核
    播放控制服务IMusicControlService:播放控制类,用于当前平台播放器对象的操作,对当前所播放曲目的暂停/播放,下一首/上一首,快进快退(寻迹),随机、单曲模式等功能的控制。播放......
  • [学习笔记] CentOS + .Net后端常用的中间件工具安装
    Redis5.0+官方文档:https://redis.io/download/#redis-downloadssudoyuminstallredisRabbitMQ3.7.11+官方文档:https://www.rabbitmq.com/install-rpm.html配置安......
  • 重定向Kubernetes pod中的tcpdump输出
    重定向Kubernetespod中的tcpdump输出最新发现一个比较有意思的库ksniff,它是一个kubectl插件,使用tcpdump来远程捕获Kubernetes集群中的pod流量并保存到文件或输出到wires......
  • 『 再看.NET7』string的进化
    string是开发过程中,使用频度最高的类型之一,所以在构建类型时作了很多处理,如“不可变性”,“保留性”等特点。string的常量是在""引号中进行赋值的。varstr1="......
  • ASP.NET6 + Mongo + OData
    准备工作Docker环境Mongo数据库配置Mongo数据库ASP.NET6集成Mongo安装MongoDB.Driver{"Logging":{"LogLevel":{"Default":"Infor......
  • 第 17 章 通过 Internet 进行通信
    17.1Java联网技术........................................29117.1.1打开跨越网络的流........................29117.1.2套接字.....................................
  • 『 再看.NET7』string的进化
    string是开发过程中,使用频度最高的类型之一,所以在构建类型时作了很多处理,如“不可变性”,“保留性”等特点。string的常量是在""引号中进行赋值的。varstr1="这是......
  • Kubernetes 常用命令
    Master节点常用命令重启apiserver#获得apiserver的pod名字exportapiserver_pods=$(kubectlgetpods--selector=component=kube-apiserver-nkube-system--output=......
  • HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(3) ---真机调试(实例
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......