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



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

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

"单身人士"只是一辈子。所有托管服务都注册了单一实例生存期,但仅仅因为某些东西是单一实例,并不意味着它有什么特别之处。例如,您可以将某个随机类注册为单例,无论何时注入它,您都会得到相同的实例。但是,它不会在启动或关闭时自行执行任何操作。

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

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

最新更新