10 .NET HostBulider

Web API学习笔记(二)—— 基本WebApi架构配置详解 Host 提供了使用预先配置的默认值创建 IHostBuilder 实例的方便方法。 阅读详情

word文档地址:https://github.com/IceEmblem/LearningDocuments/tree/master/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/Windows%20%E5%B9%B3%E5%8F%B0/Net

.NET 的一个重要的概念IHost(主机),其由HostBuilder生成

示例

var builder = new HostBuilder();
// 生成Host
builder.Build()
    // 运行Host
    .Run();

HostBuilder提供的功能

HostBuilder提供了以下功能
1.依赖关系注入容器 (DI)
2.Logging注册
3.Configuration配置注册
4.IHostedService 注册
5.Host生命周期管理

依赖关系注入容器

HostBuilder 提供已了默认的依赖注入容器,如果我们想使用其他依赖注入容器,则可以调用UseServiceProviderFactory替换

var builder = new HostBuilder();
builder.UseServiceProviderFactory(new AutofacServiceProviderFactory());

Logging注册

HostBuilder默认注册了如下日志提供者,如果需要其他日志则需要自己注册
-控制台
-调试
-EventSource
-EventLog(仅当在 Windows 上运行时)
日志的注册五花八门,这里不示例了

Configuration配置注册

我们可以使用如下方法给Host添加配置

builder.ConfigureHostConfiguration((config) =>
{
    // 配置Host的路径
    config.SetBasePath(Directory.GetCurrentDirectory());
    // 添加Json配置文件
    config.AddJsonFile("hostsettings.json", optional: true);
    // 添加环境变量配置
    config.AddEnvironmentVariables(prefix: "PREFIX_");
    // 添加命令行配置
    config.AddCommandLine(args);
    
    Dictionary<string, string> source = new Dictionary<string, string>
    {
        ["format:dateTime:longDatePattern"] = "dddd, MMMM d, yyyy",
        ["format:dateTime:longTimePattern"] = "h:mm:ss tt",
        ["format:dateTime:shortDatePattern"] = "M/d/yyyy",
        ["format:dateTime:shortTimePattern"] = "h:mm tt",
    };
    // 添加内存配置
    config.AddInMemoryCollection(source);
});

IHostedService 注册

我们可以通过如下方法注册IHostedService

builder.ConfigureServices((_, services) =>
{
    services.AddHostedService<ExampleHostedService>()
});

当Host启动时,会调用IHostedService的StartAsync方法,当Host停止时会IHostedService的调用StopAsync方法

HostBuilder注册的服务

HostBuilder注册了以下服务,我们可以通过依赖注入获取

1.IHostApplicationLifetime
通过IHostApplicationLifetime我们可以向Host注册生命周期函数

public class ExampleHostedService
{
    private readonly ILogger _logger;

    public ExampleHostedService(
        ILogger<ExampleHostedService> logger,
        IHostApplicationLifetime appLifetime)
    {
        _logger = logger;
        // Host 启动后
        appLifetime.ApplicationStarted.Register(OnStarted);
        // Host 即将停止
        appLifetime.ApplicationStopping.Register(OnStopping);
        // Host 停止后
        appLifetime.ApplicationStopped.Register(OnStopped);
}

    private void OnStarted()
    {
        _logger.LogInformation("2. OnStarted has been called.");
}

    private void OnStopping()
    {
        _logger.LogInformation("3. OnStopping has been called.");
}

    private void OnStopped()
    {
        _logger.LogInformation("5. OnStopped has been called.");
    }
}

2.IHostLifetime
IHostLifetime用于控制Host何时启动和停止

3.IHostEnvironment
IHostEnvironment保存Host的环境信息

// App 的名称
IHostEnvironment.ApplicationName
// 程序的根目录文件提供器
IHostEnvironment.ContentRootFileProvider
// 程序的根目录
IHostEnvironment.ContentRootPath
// 当前环境(开发开始生产环境)
IHostEnvironment.EnvironmentName

Asp.net core站点与HostBuilder

Asp.net core站点其实就是一个Host,这个Host包含了一个IHostedService(GenericWebHostService),GenericWebHostService监听我们的端口并将请求映射到我们的控制器

builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());

HostBuilder不局限于站点

HostBuilder并不一定要用于站点搭建,还可以用于控制台和后台服务等

示例1:如下我们使用HostBuilder构建控制台应用

namespace TestWeb2
{
    public class MyService : IHostedService
    {
        private IHttpClientFactory _httpClientFactory { get; }

        // 依赖注入 IHttpClientFactory
        public MyService(IHttpClientFactory httpClientFactory) {
            this._httpClientFactory = httpClientFactory;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            while (true) {
                Console.WriteLine("请输入命令");
                Console.WriteLine("1: 请求 \\ 2: 待开发");
                string cmd = Console.ReadLine();

                if (cmd == "1")
                {
                    Console.WriteLine("执行命令1");
                }
                else {
                    Console.WriteLine("无效的命令");
                }
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
}

    class Program
    {
        static void Main(string[] args)
        {
            IHostBuilder builder = new HostBuilder();
            builder.ConfigureServices(services =>
            {
                services.AddHostedService<MyService>();
            });
            builder.Build().Run();
            Console.WriteLine("程序已退出");
        }
    }
}

示例2:如下是 .NET 后台服务的模板代码

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // 注册Host服务
                services.AddHostedService<Worker>();
            });
}
在Windows服务中托管.Net Core项目 首先我现在的项目是一个基于.Net Core 3.1 的 WebApi 项目 考虑使用Windows 服务托管的原因有下: 1.如果在控制台启动, 会一直有个控制台在屏幕, 个人不喜欢 2.可以通过命令来启动,停止, 在使用Jenkins部署时会方便很多 实现 看了很多资料之后,发现这个事情还是比较简单的,不过在我这个事情的时候遇到了一个"很不应该"的坑, 所以,写个文章记录一下, 加深一下记忆. 首先需要在项目中添加一个Nuget包,如下: Microsoft.Extensions.Ho. 阅读详情

相关推荐

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 464

ASP.NET Core基础(四)——IHostBuilder

此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 主机封装了应用的所有资源,例如:HTTP服务器实现(Kestrel)、中间件、Logging、DI、Configuration等。 主机分为两种: .Net 通用主机IHostBuilder:(推荐使用)。Program.cs的C.

catshitone的专栏 3852

Penpot自托管全攻略:5分钟搞定私有化部署(附Docker配置详解)

本文详细介绍了Penpot开源原型设计工具的私有化部署全流程,从Docker基础配置到企业级优化方案。通过分步指南和实战技巧,帮助设计团队快速搭建安全高效的自托管环境,实现数据自主可控。内容涵盖LDAP集成、性能监控、备份策略等关键企业需求,是Penpot私有化部署的完整参考手册。

sugar的博客 1134

深入了解.NET 6 WebApplicationBuilder 和 Host

这是『探索 .NET 6』系列的第二篇文章:01 揭开 ConfigurationManager 的面纱02 比较 WebApplicationBuilder 和 Host在 .NET 中,有一种新的“默认”方法用来构建应用程序,即使用 WebApplication.CreateBuilder()。在这篇文章中,我将这种方法与以前的方法进行了比较,讨论了为什么要进行这种改变,并看看其影响。在下一篇...

farway000的博客 3117

Mamba-ST实战:用状态空间模型实现艺术风格迁移的5个关键步骤

本文详细介绍了如何使用Mamba-ST状态空间模型实现高效的艺术风格迁移,涵盖环境配置、数据预处理、模型架构、训练策略和推理优化等5个关键步骤。Mamba-ST基于SSM(状态空间模型)构建,在保持生成质量的同时显著降低计算复杂度,为风格迁移领域提供了新的解决方案。

weixin_29163581的博客 355

【AI编程】Claude Code 最强AI 编程利器项目实战详解

Claude Code 最强AI 编程利器项目实战详解

congge 7398

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4654

ASP.NET Core IHostBuilder

HostBuilder 很显然,HostBuildr 就是用来构建 Host 的构建器。 IHostBuilder 定义 通过 Build() 方法,构建器返回构建的 IHost 对象实例。 具体怎么构建呢?IHostBuilder 提供了多个扩展点,允许我们对构建过程进行扩展。 ConfigureHostConfiguration ConfigureAppConfiguration Conf...

ziqi688的博客 335

【学习系列】SAP RAP 3:添加多层级的子节点

本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。

DeveloperMrMeng的博客 588

Juniper SRX PPPoE配置

set interfaces pp0 unit 1 ppp-options chap default-chap-secret 拨号用户名密码。set interfaces pp0 unit 0 ppp-options chap default-chap-secret 拨号密码。set interfaces pp0 unit 0 ppp-options chap local-name 拨号用户名。6号口接运营商进行拨号。

Jian Sun_的博客 750

增强的C# IHostBuilder/IHost和依赖项注入解析程序库

我喜欢用于构建应用程序的IHostBuilder/IHost方法。但是我发现配置必要的IHostBuilder令人困惑。还有一些功能,例如配置值的日志记录和加密/解密,我经常使用这些功能,我希望它们可以轻松地包含在IHost中。J4JHostConfiguration库是我完成所有这些的尝试。它还支持创建依赖项注入解析程序对象,你可以在缺少内置DI解析程序的任何C#应用程序中使用。

寒冰屋的专栏 1062

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例文件注释--olaFlow-算例1- baseWaveFlume

ou_no的博客 3640

.NET5中 Host.CreateDefaultBuilder(args)详解

.NET5阅读心得之CreateDefaultBuilder(args)使用

qbc12345678的博客 4221

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

.NET 7 中的 HostApplicationBuilder

.NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中,ASP.NET Core 引入了 Minimal API,对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API,在 .NET 7 Preview 3 中,引入了一个 HostApplicationBuilder ,我们...

dotNET跨平台 1598

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程

  通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置、应用程序配置、日志配置和依赖注入配置这4个部分。由于水平和篇幅有限,先整体理解、建立框架,后面再逐步细化,对每个配置部分再详细拆解。一.创建默认主机Host.CreateDefau...

dotNET跨平台 1132

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# Worker Service的基础应用

C# 使用Worker Service创建跨平台服务。

XUMENGCAS的博客 8577

.NET 8 Host 的一些更新

.NET 8 Host 的一些更新Intro.NET 8 里针对 Host 做了一些更新,除了前面提到的 IHostedLifecycleService 之外,还支持的 HostedService 的并发地启动和停止,还抽象了在 .NET 7 开始支持的HostApplicationBuilder 引入了 IHostApplicationBuilder API,并且引入了一个 Host.Crea...

dotNET跨平台 643

C#.NET 主机详解

C#.NET主机模型概述 C#.NET中的主机(Host)是封装应用程序资源和生命周期管理的核心组件,提供统一的配置、启动和停止机制。主要分为普通主机(HostBuilder)和通用主机(Generic Host)两种类型: 普通主机:适用于非Web应用场景,提供依赖注入、配置管理、日志记录和生命周期管理等基础功能。 通用主机:增强版本,专为控制台应用、Worker服务等非HTTP应用设计,具有以下特点: 内置依赖注入容器 多源配置支持 集成日志框架 IHostedService接口支持后台服务 环境区分能

tangPHP的博客 1158

.NET 6 中将 ASP.NET Core 注册成 Windows Service

前言使用 Visual Studio 中的 Worker Service项目模板:我们很容易创建出 Windows Service:IHosthost=Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services=> { services.Add...

dotNET跨平台 1249

.NET6打包部署到Windows Service

1.安装Nuget包安装以下nuget包支持windows service<PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="6.0.10" /> <PackageReferenceInclude="Microsoft.Extensions.Hosting.Windo...

dotNET跨平台 1169

.net5控制台程序使用IOC容器

创建控制台应用 class Program { static void Main(string[] args) { Host.CreateDefaultBuilder().ConfigureServices((builder, services) => { var config = builder.Configuration; serv

qq_45659882的博客 891

c#设计模式- Builder模式(建造者模式)

参考以下链接 http://www.cnblogs.com/zhenyulu/articles/37378.html http://wenku.baidu.com/link?url=9pgl-CINtdSZKeL9PEZ2AggLB1gppKpMRqmyhcvqOUrXQn9hIXZVKmPAI_0dl7JdOhRKFvXmL9YDCnB_MhTatWZvRqAzmHH-ia67yfrBH

fffanpei的专栏 1141

.net6 core web项目发布部署到IIS,以Windows服务的形式部署启动

.net6 core web项目发布部署到IIS,以Windows服务的形式部署启动

人生若南柯一梦 4274

.NET Core开发实战--01.ASP.NET Core 启动过程

ASP.NET Core 启动过程

cherish12_24的专栏 687
上一篇: 9 .NET 日志
下一篇: 11 .NET Http请求
dabusidede
博客等级 码龄9年 84粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值