Asp.net core 3.1利用IHostedService为系统注入自己的主机
IHostedService
这个接口只包含两个成员方法:
Task StartAsync(CancellationToken cancellationToken);
Task StopAsync(CancellationToken cancellationToken);
Host中可以包含多个IHostedService服务实例。当然,如果是Web应用其中一个就是WebHost。Host起来之后,会依次启动所有添加的这些IHostedService服务。
下面我们给一个例子,如何在Web服务之外注入自己的一个服务程序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using System.Threading;
using System.Diagnostics;namespace aspnetapp
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}public class Worker : IHostedService{public Task StartAsync(CancellationToken cancellationToken){Debug.WriteLine("Start");return Task.CompletedTask;}public Task StopAsync(CancellationToken cancellationToken){Debug.WriteLine("End");return Task.CompletedTask;}}
}
上面的例子中,Worker就是我们自己定义的一个服务程序。整个系统运行起来后,它会自动调用Worker.StartAsync()方法。
此外,如果我们想控制我们自己的服务程序的生命周期,那么可以使用IHostApplicationLifetime,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using System.Threading;
using System.Diagnostics;namespace aspnetapp
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}public class Worker : IHostedService{private readonly ILogger _logger;private readonly IHostApplicationLifetime _appLifetime;public Worker(ILogger<Worker> logger, IHostApplicationLifetime appLifetime){_logger = logger;_appLifetime = appLifetime;}public Task StartAsync(CancellationToken cancellationToken){_appLifetime.ApplicationStarted.Register(OnStarted);_appLifetime.ApplicationStopping.Register(OnStoping);_appLifetime.ApplicationStopped.Register(OnStopped);return Task.CompletedTask;}public Task StopAsync(CancellationToken cancellationToken){return Task.CompletedTask;}private void OnStarted(){_logger.LogInformation("OnStarted has been called.");}private void OnStoping(){_logger.LogInformation("OnStoping has been called.");}private void OnStopped(){_logger.LogInformation("OnStopped has been called.");} }
}
Asp.net Core框架内部会自己注入一个IHostApplicationLifetime实例,它是Singleton的,也就是它是一个单一实例。所有注入的主机都用这一个IHostApplicationLifetime实例进行生命周期管理,那为什么单个生命周期管理实例就可以管多个主机的生命周期呢?这是由于Cancellationtoken对象的Register()方法是可以调用多次,即可以注册多次回调的委托方法的。IHostApplicationLifetime实例是在HostBuilder类中注入的(下面是截取的代码片段):
private void CreateServiceProvider(){var services = new ServiceCollection();services.AddSingleton(_hostingEnvironment);services.AddSingleton(_hostBuilderContext);services.AddSingleton(_appConfiguration);services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();services.AddSingleton<IHostLifetime, ConsoleLifetime>();services.AddSingleton<IHost, Host>();services.AddOptions();services.AddLogging();// ....// ....
上面这段是找到的官方源码,应该不是微软最新的。IApplicationLifetime其实就是现在的IHostApplicationLifetime。IApplicationLifetime已经做旧,已经被IHostApplicationLifetime替代,两个接口内部的定义完全一样。但是就是找不到IHostApplicationLifetime官方源码,只是从别人的博客里看到说两个接口是一样的。
Asp.net core 3.1利用IHostedService为系统注入自己的主机相关推荐
- Asp.Net Core 轻松学-利用日志监视进行服务遥测
原文:Asp.Net Core 轻松学-利用日志监视进行服务遥测 前言 在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予 ...
- 避免在 ASP.NET Core 3.0 中为启动类注入服务
本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...
- ASP.NET Core 3.x控制IHostedService启动顺序浅探
想写好中间件,这是基础. 一.前言 今天这个内容,基于于ASP.NET Core 3.x. 从3.x开始,ASP.NET Core使用了通用主机模式.它将WebHostBuilder放到了通用的I ...
- ASP.NET Core 2.0利用MassTransit集成RabbitMQ
在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁.近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用 ...
- ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试. 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的 ...
- .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入
本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...
- ASP.NET Core如何在ActionFilterAttribute里做依赖注入
点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...
- 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...
- 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入
本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...
最新文章
- semantic computing Cognitive linguistics Distributed intelligence
- linux特殊符号大全
- 一个供应商只允许一个报价单
- java小编程----str中没有内容
- c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...
- C#.Net工作笔记014---C#中internal的意思
- JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
- js_单例模式制作无限弹窗(3s内销毁)
- pdf417条形码开发
- 最简单的WIN7内核PE系统(U盘,硬盘,移动硬盘版支持原版WIN7安装
- 【Linux operation 09】 - SUSE 12 SP5官网下载
- edge播放视频HTML5黑屏,Win10 edge 浏览器 播放视频黑屏解决方法
- java无法双击打开.jar文件/jar包以压缩文件显示
- 2022最新批量删除微博教程!支持批量删除微博批量删除清空点赞关注评价以及粉丝
- jQuery推箱子小游戏
- 百篇已过,又是一个新篇章,谈谈感受吧
- POI删除Excel中数据有效性
- Ajax和Json使用
- 【JAVA今法修真】 第二章 一气化三清 线程分心念
- python小黄鸡nlp聊天机器人