后台服务和单例服务有什么区别?

cub*_*nyc 1 asp.net-core

我有一项服务应该在服务器启动时启动,并在整个服务器生命周期中继续运行。我希望能够使用 Web 前端管理服务(查询、修改运行时选项等)。在研究实现这一目标的最佳方法时,我遇到了两个选择:具有单例生命周期的作用域服务和后台服务/IHostedService。这两种选项有什么区别,什么时候应该使用其中一种而不是另一种?

Chr*_*att 5

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

“单身”只是一生。所有托管服务都以单例生命周期注册,但仅仅因为某些东西是单例,并不意味着它会做任何特殊的事情。例如,您可以将一些随机类注册为单例,并且每当注入它时,您总是会得到相同的实例。但是,它在启动或关闭时不会自行执行任何操作。

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

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