暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

.NET Core设计自定义宿主服务(Service Hosting)

码农游乐场 2021-09-08
1724

很多时候我们都会有设计一个后台服务的需求,比如,传统的Windows Service,或者Linux下的守护进程。这类应用的一个共同特点就是后台运行,并且不占用控制台界面。通常情况下,后台服务在提供服务时,会通过日志输出来记录服务处理的详细信息,用户也可以根据具体需要来设置不同的日志级别(Log Level),从而决定日志的输出详细程度。无论是传统的Windows Service还是Linux守护进程,都是开发人员非常熟悉的应用程序形式,开发技术和开发模式都是大家所熟知的,那么,在 .NET Core 中,又如何专业地实现这类后台服务应用呢?

主要有以下几个方面:

  • 具有非常好的隔离性:开发者只需要关注怎么实现自己的后台服务逻辑即可,不需要关注服务运行的保障体系,比如:如何正常终止服务、如何写入日志、如何管理对象生命周期等等

  • 具有非常好的编程体验:使用过ASP.NET Core的开发者能够快速上手,直击主题,快速实现业务处理逻辑

  • 可扩展、可配置的应用程序配置体系

  • 可扩展、可配置的日志体系

  • 可扩展、可配置的依赖注入体系

  • 对服务宿主环境的区分。比如:在ASP.NET Core中,通常分为Development、Test、Staging、Production等环境,不同的环境可以有不同的配置信息等

设计

从本质上讲,一个 .NET Core 服务宿主程序只需要实现IHostedService接口,然后在控制台应用程序中通过HostBuilder来建立一个Host实例,并将IHostedService的实例注册到Host中,然后直接运行即可。下面的代码展示了这种最基础的实现方式:

    class MyService: IHostedService
{
private readonly ILogger logger;
public MyService(ILogger<MyService> logger)
{
this.logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
this.logger.LogInformation($"[{DateTime.Now}]-MyService Started");

return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
this.logger.LogInformation($"[{DateTime.Now}]-MyService stopped.");
return Task.CompletedTask;
}
}

复制
static void Main(string[] args)
{
var hostBuilder = new HostBuilder().ConfigureServices(serviceCollection =>
{
serviceCollection.AddSingleton<IHostedService, MyService>();
})
.ConfigureLogging((logging) =>
{
//添加控制台输出
logging.AddConsole();
});
hostBuilder.RunConsoleAsync().Wait();
}

复制

我们已经成功地实现了一个服务宿主程序,执行程序,会在控制台打印Host Started的字样,并提示目前的执行环境为Production,按下CTRL+C可以结束程序的执行。在按下CTRL+C时,控制台又会输出Host Stopped字样,然后程序退出。终端显示如下

info: JobSchedule.ConsoleApp.MyService[0]
[2020/4/30 14:40:17]-MyService Started
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:\workSpace\2017\JobSchedule.Manager\JobSchedule.ConsoleApp\bin\Debug\netcoreapp3.1\

复制

上面的代码最关键的一点就是要将IHostedService的实现类注册到依赖注入框架中,于是,Host Builder在运行主机(Host)的时候,就会通过IHostedService接口类型找到已注册的实例,然后运行服务。通过Host Builder,我们还可以对宿主程序的执行环境、配置信息、日志等各方面进行配置,从而提供更为强大的服务端功能

换一种写法

和 asp.net web项目是不是很像了

static void Main(string[] args)
{
Host.CreateDefaultBuilder(args).ConfigureServices(serviceCollection =>
{
serviceCollection.AddSingleton<IHostedService, MyService>();
})
.ConfigureLogging((logging) =>
{
//添加控制台输出
logging.AddConsole();
//添加调试输出
logging.AddDebug();
}).Build().Run();
}

复制

总结

本文介绍了基于.NET Core通用主机(Generic Host)的服务宿主框架的设计与实现,详细代码可以点击文后的下载链接进行下载。有关.NET Core Generic Host以及本文介绍的框架,还有很多高级功能和特殊用法,有需要的读者可以在本文留言,共同探讨。


文章转载自码农游乐场,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论