.NET Core 中的 Generic Host快速使用指南

.NET Core 中的 Generic Host快速使用指南本文以自己在工作中学习和使用.netcoregeneric-host作一个总结。前言在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWe…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

本文以自己在工作中学习和使用.net core generic-host 作一个总结。

前言

在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建WebHost

常常我们的需求不需要创建Web项目,比如后台任务,那么我们如何像使用AspNetCore一样创建控制台项目。

如何在控制台程序中创建主机

  1. 通过dotnet new console 创建一个控制台项目

  2. 通过Nuget添加以下包

  • Microsoft.Extensions.Hosting

首先,我们看下IHostBuilder接口里的方法

public interface IHostBuilder
{
IHost Build();

IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);

IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);

IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);

IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);

IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory);
}
  • ConfigureAppConfiguration() 可以配置应用的一些配置,如环境变量等等

  • ConfigureContainer() & UseServiceProviderFactory() 可以配置替换默认的依赖注入的组件,比如替换成Autofac

  • ConfigureHostConfiguration() 可以配置IConfiguration

  • ConfigureServices() 可以注入服务

接下去,通过以下代码,我们可以构建一个简单的主机。

static void Main(string[] args)
{
CreateDefaultHost(args).Build().Run();
}

static IHostBuilder CreateDefaultHost(string[] args) => new HostBuilder()
.ConfigureHostConfiguration(builder =>
{
//todo
})
.ConfigureAppConfiguration((ctx, builder) =>
{
builder
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables()
;
})
.ConfigureServices((ctx, services) =>
{
services.AddLogging();
services.AddHostedService<CustomHostService>();
})
.UseConsoleLifetime()
;

public class CustomHostService: IHostedService
{

private ILogger _logger;
private Task _executingTask;

public Task StartAsync(...)
{
_logger.LogInformation($"{ nameof(CustomHostService):}start");

_executingTask = ExecuteAsync(...);
if(_executingTask.IsCompleted){
return _executingTask;
}
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
return Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken));
}

public Task ExecuteAsync(...)
{
_logger.LogInformation($"{ nameof(CustomHostService):executing}")
return Task.Delay(5000);
}

}

如上,我们自定义的 CustomHostService 需要实现 IHostedService接口,当然,我们可以直接继承 BackgoundService 类。

在实现了 IHostedService 接口后,我们通过 services.AddHostedService<>() 进行注入,或者通过 service.AddTransient<IHostedService,THostedService>() 进入注入。

启动以上项目,我们发现,我们的程序默认的Hosting Environment一直是Production,那么如何修改呢 ??

配置环境变量

在AspNetCore项目中,我们可以通过设置环境变量ASPNETCORE_ENVIRONMENT的值来指定主机环境变量的。而在Generic Host 中暂时没有这一项配置。

如果查看IHostBuilder的扩展,我们会发现以下方法:


new HostBuilder()
.UseContentRoot(...)
.UseEnvironment(...)
...

查看源代码后,我们可以通过ConfigureHostConfiguration()方法将这些配置配置到主机中。

现在我们假设我们以DOTNETCORE_ENVIRONMENT来指定GenericHost的环境。

new HostBuilder().ConfigureHostConfiguration(builder =>
{
builder.AddInMemoryCollection(new Dictionary<string, string>
{
[HostDefaults.EnvironmentKey] = Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT"),
})
// Nuget:Microsoft.Extensions.Configuration.CommandLine
//.AddCommandLine(args)
;
})

//...

现在让我们打开命令行测试下。设置完成环境变量后我们通过dotnet run 启动程序。查看输出,Host Environment 变成为 Stage

# 设置环境变量
$env:DOTNETCORE_ENVIRONMENT='Stage'
# 查看环境变量
$env:DOTNETCORE_ENVIRONMENT

当然我们也可以通过 commandline 的参数来设置启动的环境变量等值。

Install-Package Microsoft.Extensions.Configuration.CommandLine

ConfigureHostConfiguration()中使用.AddCommandLine(args)来指定参数。

现在我们可以通过 dotnet run --environment=Development来指定dev环境了,此时我们发现我们终于成功加载appsettings.Development.json中的配置信息了。

使用Autofac来替代默认的 DI

简单认识一下Autofac

一个第三方的依赖注入容器,相对Microsft.Extensions.DependencyInjection使用更加简单方便。

集成到Host中

通过Nuget安装以下两个包

Install-Package Autofac

Install-Package Autofac.Extensions.DependencyInection

我们可以使用UseServiceProviderFactory()service.AddAutofac() 将默认的DI 替换成 Autofac;

使用ConfigureContainer<ContainerBuilder>()可以使用Autofac来注入服务;

//省略了非关键代码
static IHostBuilder CreateDefaultHost(string[] args) => new HostBuilder()
//...略
.ConfigureServices((ctx, services) =>
{
services.AddLogging(x=>{x.AddConsole();});

services.AddAutofac();
})
.ConfigureContainer<ContainerBuilder>(builder =>
{
builder.RegisterType<CustomHostService>()
.As<IHostedService>()
.InstancePerDependency();
})
.UseServiceProviderFactory<ContainerBuilder>(new AutofacServiceProviderFactory())
//...略

总结

个人认为出现GenericHost解决的几个痛点,相对AspNetCore中的管道机制,控制台程序如果不依靠GenericHost来管理Di,想进行大量Microsoft.Extensions包的集成会非常困难。通过IHostedService,可以方便的进行服务的托管。

源码: https://github.com/missxueo/docs-generic-host

原文地址:https://www.cnblogs.com/myzony/p/10482113.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182766.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker镜像操作_docker主要特性

    docker镜像操作_docker主要特性前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

    2022年7月29日
    5
  • Traceroute原理学习

    Traceroute原理学习Traceroute可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由。曾经介绍过IP记录路由的选项RR,为什么不使用这个选项而另外开发一个新的应用程序Traceroute呢?原因有三:其一,并不是所有的路由器都支持记录路由这个选项;其二,记录路由一般是单向的选项,发送端设置了该选项,接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。大多数的ping服

    2022年7月21日
    15
  • 【Custom Mutator Fuzz】Libprotobuf + LibFuzzer联合使用

    【Custom Mutator Fuzz】Libprotobuf + LibFuzzer联合使用终于到了与fuzzer结合使用的章节了,本篇文章为Libprotobufmutatorfuzzinglearning项目的第二个练习,其中有一些坑点,在本文中也进行了标注编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノPS:文章末尾有联系方式,交个朋友吧~本文链接:模糊测试系列往期回顾:【CustomMutatorFuzz】简单Protobuf使用练习【CustomMutatorFuzz】ProtocolBuffer基础(下):C++生成代.

    2025年11月7日
    4
  • centos7密码复杂度设置(centos编辑文件)

    Linux系统-CentOS6-知识简谱。图谱内各部分的详细知识请关注学习路上-CentOS专栏。

    2022年4月15日
    143
  • 网络基础知识题_基础有哪些类型

    网络基础知识题_基础有哪些类型本文结合多年来的工作实践,来详细讲述一下作为IT从业人员要掌握的一些基础网络知识。

    2025年8月30日
    3
  • python turtle 表白_pythonturtle背景颜色

    python turtle 表白_pythonturtle背景颜色python中用turtle画爱心表白运行后的效果图:下面的代码是在python3.7写的,代码有点长,但却语法简单易懂代码如下:importturtlestr=input(‘请输入表白语:’)turtle.speed(10)#画笔速度turtle.setup(1800,700,70,70)turtle.color(‘black’,’pink’)#画笔颜色t…

    2025年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号