在.NET Core微服务中使用HostBuilder和Generic Host

基于控制台的服务中探索一个简单模式,以解决跨领域问题。

“通用” HostHostBuilder是随.NET Core 2.1发布而发布的新功能组件的组件。它们的一个用例是通过提供用于添加横切关注点(例如依赖注入,配置和日志记录)的模式来简化基于控制台的服务的创建。

介绍

自ASP.NET Core 1.0发布以来,我们有了WebHostBuilder类,它允许我们配置和构建WebHost然后,当服务器(Kestrel)接受并处理HTTP请求时,它将处理应用程序的生命周期。在ASP.NET Core 2.0中,WebHostBuilder得到了一些进一步的改进和简化。WebHostBuilder允许我们执行诸如使用依赖注入容器来配置服务的事情; 通常是由Microsoft提供的作为ASP.NET Core一部分的容器。WebHostBuilder还允许我们将来自多个源的配置加载到键/值对的最终配置表示中。

对于ASP.NET Core Web应用程序来说,这些工作非常好,但是到目前为止,在其他类型的应用程序的框架中没有类似的选项!

注意:请记住,这篇文章是基于ASP.NET Core 2.1预览版1发布的。因此,在公开预览期间以及在最终发布2.1之前,事情可能会根据预览期间收到的反馈进行更改。

介绍IHost和HostBuilder

使用.NET Core 2.1的开发人员可以使用的新选项是新的“通用”主机,它使开发人员能够轻松设置横切关注点,例如针对非Web焦点应用程序的日志记录,配置和依赖注入。团队已经认识到,将主机绑定到HTTP的关注可能不是一个理想的解决方案,因为其中许多这些东西是其他应用程序类型的通用要求。

可以使用这个地方的一个例子是在需要运行后台处理任务的控制台应用程序中,例如可能处理队列中的消息。现在,这些类型的服务在基于云的本地基于容器的体系结构中很常见。

在.NET Core的当前2.0版本中,当然可以在控制台应用程序中使用日志记录,配置和DI库。在工作中,我们有许多微服务,它们处理来自队列的消息和数据丰富任务。我们必须自己手动包含和设置这些常见问题。虽然这是可能的,但在应用程序中设置DI设置之类的东西需要一些管道。

建立一个主机

要创建主机,我们可以使用新的HostBuilder,它具有与现有WebHostBuilder类似的一组方法和扩展。因此,使用ASP.NET Core的任何人都应该熟悉这些模式。

有一个主要的区别需要注意。HostBuilder不提供扩展方法,允许您像使用WebHostBuilder一样使用启动类。这个决定主要是为了避免在幕后创建两个独立的DI容器。使用通用主机,配置单个服务集合,然后用于构建最终服务提供者。

在您的应用程序的Main方法中,您可以先创建一个HostBuilder,然后使用扩展方法向DI注册服务,读取配置并配置您的应用程序所需的日志记录。

解释该功能的最佳方式是举一个例子。如果你想查看完整的示例代码,你可以从GitHub中获取它

如果我们看看这个控制台应用程序的Main方法,我们可以探索为我们的应用程序创建一个Host。

 

如果您已经使用过ASP.NET Core,并且已经看到了WebHost构建器,特别是在1.0时间框架中,这看起来可能非常熟悉。我们首先创建一个HostBuilder,然后我们可以使用它来定义我们想要创建的主机。本例中的第一个方法是ConfigureAppConfiguration方法。这个方法允许我们配置应该使用哪个配置提供者来为我们的应用程序构造配置值的最终表示。

这与使用WebHostBuilder时可以自定义配置的方式相同。在这个例子中,我们已经说过,我们希望首先从appsettings.json文件中读取配置值,然后是环境变量,最后是传递到应用程序中的任何参数。

接下来我们调用ConfigureServices,就像WebHostBuilder一样,允许我们用ServiceCollection注册服务。使用ServiceCollection上的扩展方法执行注册,一旦完成,将使我们能够在我们的应用程序中有DI可用的任何地方获取这些注册的实例。

在这种情况下,第一个添加了ASP.NET Core Options服务,第二个为IOptions绑定设置了注册。最后的服务注册是我稍后会谈到的。

最后一节,ConfigureLogging如你所期望的那样设置应用程序的日志记录。在这种情况下,我们添加控制台日志记录,它使用应用程序配置中的值来确定要记录的内容。

本示例中的日志记录配置与使用模板创建的默认ASP.NET Core Web应用程序中的配置相同。

 

最后一步是在构建和启动应用程序的HostBuilder上调用RunConsoleAsync。它会一直运行,直到CTRL + C被用来触发它关闭。

完成任务

如果我们把它留在这里,服务就不会太好。此时我们只是运行一个控制台应用程序,但实际上并没有做任何有用的事情。因此我们需要一种方法来定义应用程序应该执行的工作。

为这种服务风格推荐的模式是利用新的IHostedService功能,首先在ASP.NET Core 2.0中引入。

这里我们有一个基本的IHostedService实现,它将在这个服务中运行...

 

我不会深入研究这些代码,但我会总结一下它在做什么。当应用程序启动时,它将在此服务上调用StartAsync。在该方法中,我们创建了一个每5秒钟执行一次工作的定时器。

作品本身在DoWork中定义。这里只是用户将ILogger记录为信息。这包括从应用程序配置中检索的消息。这是通过DI传递给服务的IOptions对象访问的。

在关机时,StopAsync被调用,服务在应用程序被终止之前清理一点。这是一个非常人为的例子,但我想简单地把事情放在一起,并专注于这些部分如何组合在一起。

通过定义IHostedService实现,我们只需使用ConfigureServices中的以下常见操作(我们在前面看到)将其注册到DI容器。

services.AddSingleton<IHostedService, PrintTextToConsoleService>();

如果我们需要在此服务中运行各种东西,我们可以添加多个托管服务。

概要

使用这种新的“通用”主机概念有很多情况。在这篇文章中,我们已经探索了一个非常基本的例子,但是我不需要太多的工作来简化我们环境中的一些微服务。对于Web应用程序和服务有一个通用模式,并且可以轻松访问DI,日志记录和配置等特性,这是非常受欢迎的。

相关文章:

  • ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

原文地址: https://www.cnblogs.com/BeanHsiang/articles/9085914.html


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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最小环】【Floyed】观光旅游(ssl 1763)

观光旅游 ssl 1763 题目大意&#xff1a; 在一个图中找到最小环 原题&#xff1a; 题目背景 在桑给巴尔岛的Adelton城镇上有一个旅游机构。它们决定在提供许多的其它吸引之外&#xff0c;再向客人们提供旅游本镇的服务。 为了从提供的吸引服务中尽可能地获利&#xff0c;…

P2604 ZJOI2010 网络扩容,费用流裸题

网络扩容 题目链接 https://www.luogu.org/problemnew/show/P2604 题解 对于每条边u→vu \rightarrow vu→v,我们将按照容量CCC,费用000建边,这些算是免费边. 然后我们再对同一对点u,vu,vu,v建立一条容量为INFINFINF,费用为扩容费用WWW的边,这些边算是扩容流量要走的边,有费…

P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P3292 题目大意 nnn个点的一棵树&#xff0c;每个点都点权。每次询问一条路径&#xff0c;选择若干个点的异或和最大。 解题思路 路径上的如何进行计算&#xff0c;我们知道我们可以用倍增来计算权值和。我们可以把每个线性基…

EntityFramework Core进行读写分离最佳实践方式,了解一下?

本来打算写ASP.NET Core MVC基础系列内容&#xff0c;博客评论有园友提出讲讲读写分离&#xff0c;这个问题提的好。大多数情况下&#xff0c;对于园友在评论中提出的问题&#xff0c;如果是值得深究或者大多数同行比较关注的问题我都会私下去看看&#xff0c;然后进行对应解答…

P3980 NOI2008志愿者招募

志愿者招募 题目链接 https://www.luogu.org/problemnew/show/P3980 题解 这道题很神奇,这种建图方法很有启发性. 我们平时做的题都点都是是一对一的,而这道题的点的对应关系是一对多(即一个志愿者对应一段连续的区间,也就是多个时间点)的,直接按照传统的网络流建图方法来…

小X的加法难题

小X的加法难题 题目大意&#xff1a; 一个AB的式子&#xff0c;但之间有一些没用的空格&#xff0c;要你求出结果 原题&#xff1a; 解题思路&#xff1a; 字符输入&#xff0c;有数字就存起来&#xff0c;用加号和换行符来分开 代码&#xff1a; #include<cstdio>…

P3857-[TJOI2008]彩灯【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P3857 题目大意 nnn个彩灯&#xff0c;mmm个开关能使得某些彩灯取反&#xff0c;求有多少种彩灯样式。 解题思路 其实就是mmm个数种若干个数异或起来有多少不同的数。 又是一道考线性基性质的题目&#xff0c;因为线性基中任…

【桶排】小 X 的密码破译

小 X 的密码破译 题目大意&#xff1a; 有一堆式子&#xff0c;去重再排序后&#xff0c;按规则求出结果 原题&#xff1a; 解题思路&#xff1a; 把每一个求出来的数丢到桶里&#xff0c;然后跑一遍就可以了 代码&#xff1a; #include<cstdio> using namespace s…

Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

Zombie’s Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v1v_1v1​,第二种物品重量s2s_2s2​,价值v2v_2v2​,背包重nnn,求能装的最大价值之和. 数据全都是2e92e92e9.也就是两种物品的完全背包. 题…

Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.这篇文章我要介绍一下 OpenID Connect.OAuth 2.0 不是身份认证协议OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因…

P4301-[CQOI2013]新Nim游戏【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4301 题目大意 nnn个石头&#xff0c;先手先取走若干堆&#xff08;不能全取&#xff0c;可以不取&#xff09;&#xff0c;后手取走若干堆&#xff08;不能全取&#xff0c;可以不取&#xff09;。然后进行NimNimNim游戏&am…

P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]

阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就在TrieTrieTrie树中向父节点移动一步.读入PPP的时候,就做一个标记. 然后对这颗TrieTrieTrie树…

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关&#xff0c;有一个功能是统一验证&#xff0c;它的作用是把没有访问权限的请求挡在API网关外面&#xff0c;而不是到达API网关事端的API时才去验证&#xff1b;之前我有一篇博文Ocelot统一权限验证&#xff0c;作过说明&#xff0c;这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意&#xff1a; 在一个玻璃瓶里&#xff0c;放入一些液体&#xff0c;某一对液体放在一起会有反应&#xff0c;当某个液体有反应时危险度就会乘2&#xff08;初值为1&#xff09;&#xff0c;问危险度最大是多少 原题&#xff1a; 解题思路&#xff1…

P4151-[WC2011]最大XOR和路径【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4151 题目大意 给一个无向图&#xff0c;求一条1∼n1\sim n1∼n的路径使得异或和最大。 解题思路 很强的思路啊&#xff08;好像去年YPXYPXYPX大爷就讲了反正我也没听懂&#xff09; 我们可以将路径拆分成三部分&#xff…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码&#xff1a;https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍&#xff0c;因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…

初一模拟赛总结(2019.4.13)

成绩&#xff1a; rank是有算其他dalaodalaodalao的 注&#xff1a; 这次好像是因为OJ有问题&#xff0c;导致一些AC代码变&#xff08;bei&#xff09;W&#xff08;zhi&#xff09;A&#xff08;cai&#xff09;了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)W(1)xb(1)z^{(1)} W^{(1)}xb^{(1)}z(1)W(1)xb(1) a(1)σ(z(1))a^{(1)} \sigma(z^{(1)})a(1)σ(z(1)) z(2)W(2)a(1)b(2)z^{(2)}W^{(2)}a^{(1)}b^{(2)}z(2)W(2)a(1)b(2) a(2)σ(z(2))a^{(2)} \sigm…

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后&#xff0c;虽然在一定程度上改善了问题&#xff0c;但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库&#xff0c;同时有的指出是否可以进行底层无感知操作&#xff0c;这确实是个问题&#x…