BackgroundServices和SingletonServices之间有什么区别?

时间:2020-01-10 18:58:39

标签: asp.net-core

我有一项服务,该服务应在服务器启动时启动,并在整个服务器生命周期中继续运行。我希望能够通过Web前端管理服务(查询,修改运行时选项等)。在研究实现此目标的最佳方法时,我遇到了两个选择:具有单例生存期的范围服务和backgroundservice / IHostedService。两种选择之间有何区别?何时应使用一种替代另一种?

1 个答案:

答案 0 :(得分:1)

这些都不是真正的东西。最接近的是单例和托管服务的概念。托管服务是一个实现IHostedService的类,它非常符合您要查找的内容,因为它将在应用程序启动时启动,并在应用程序关闭时停止。 ASP.NET Core 3.0添加了一个BackgroundService类,它只是IHostedService的一种实现,其中很多东西都难以定义启动/停止/等情况。覆盖。实际上,从BackgroundService继承通常更有意义,但是您也可以直接自己实现IHostedService

“单身”只是一辈子。所有托管服务都以单例生存期进行注册,但是仅仅因为某事是单例,并不意味着它会做任何特别的事情。例如,您可以将某个随机类注册为单例,并且无论何时注入它,您都将始终获得相同的实例。但是,它不会在启动或关闭时自行执行任何操作。

长短不一,这里没有不同的选择。您正在寻找托管服务。也就是说,它只能解决您要查找的部分内容,因为它将在应用程序运行时“运行”。但是,您无法真正连接到它或直接与其交互。它不像Web Api之类。例如,它不针对HTTP请求公开。

要“管理”它,您必须公开某种API,然后通过代码与服务进行交互。例如,文档提供了一个排队后台服务的示例,该后台服务处理添加到队列中的内容。但是,要排队,您需要执行一些操作,例如创建API端点,注入队列,然后使用代码将新项目添加到队列。然后,实际的托管服务最终将从队列中弹出该任务并对其进行处理。