0

我的 Web 应用程序必须根据我的 .NET 5 MVC Web 应用程序上的一些用户生成数据每 1、2、7 天发送一些电子邮件。该应用程序非常复杂,因为它是 3 个门户网站一起运行并相互交互。

触发器很简单,例如:如果用户在 1 天内未完成此发票,则发送提醒邮件。如果用户没有收到反馈(并将其插入到我们的网络应用程序表单中并保存),则每 2 天发送一次邮件提醒。

等等....

通常我使用 Windows 服务来执行此操作,因为您可以轻松地在 C# 中建立一个控制台程序,安排它并忘记它。

这一次,我想尝试用我曾经在项目中看到但从未使用过的东西来做这件事:IHostedService(或 IHost)或 .NET 5 中的 BackgroundService。

既是为了学习新东西,也是为了让我可以通过依赖注入重用大部分数据库代码

我记录了自己一点,这就是我发现的:

Asp.Net - 使用 IHostedService 的计划任务

.NET Web 服务和 BackgroundWorker 线程

如何在 ASP.NET Core 2.1 中的计时器上运行 BackgroundService

调度程序后台服务中的异步计时器

关于依赖注入:

.net 核心依赖注入到托管服务 所以它有一些关于整个 Singleton 的事情要解决。

现在,这似乎有点不可靠,或者乍一看似乎是一个优雅的解决方案,但稍后会因神秘的行为和错误而导致大量的头发拉扯,并且存在很多问题。

  1. 这些服务的用例是什么?它们看起来更像是框架的一个花哨的插件,很少使用,因为它们明显的局限性阻碍了它们。
  2. 我应该尝试使用它们还是使用 Windows 服务(然后将我编写的所有数据库代码都带入其中)?
4

1 回答 1

0

以下是一些值得考虑的点,我认为应该清除我们的迷雾:

我记录了自己一点,这就是我发现的

简而言之,它们都是类实例继承自IHostedService,.Net Core 为我们提供了一个抽象基类,称为BackgroundService,显然IHostedService也继承自,正如我们在这里看到的那样。

这些服务的用例是什么?它们看起来更像是框架的一个花哨的插件,很少使用,因为它们明显的局限性阻碍了它们。

用于BackgroundService与以下相关的任务:

  • 安排应运行间隔的任务。
  • 长时间运行的任务。
  • 作为我们业务逻辑的后台进程。
  • 很多很多,只要它适合我们的情况......

所以它有一些关于整个 Singleton 的事情要解决。

如果我们在其中需要一些范围或临时服务,我强烈建议您花点时间研究一下Dependency injection,了解它的总体思路,这不会浪费您的时间,而且我们通常,所有语言和库的想法都是相同的。

这个简单的块代码在这里解决了那个问题BackgroundService

public abstract class MyProcessor : Microsoft.Extensions.Hosting.BackgroundService
{
    protected readonly IServiceScopeFactory ServiceScopeFactory;

    protected MyProcessor(IServiceScopeFactory serviceScopeFactory)
    {
         ServiceScopeFactory = serviceScopeFactory;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        using var scope = ServiceScopeFactory.CreateScope();
        var myService = scope.ServiceProvider.GetRequiredService<EmailService>();
        //... Any logic below as you wish
        // Put them in a loop with [await Task.Delay()] to make it run interval
    }
}

我应该尝试使用它们还是使用 Windows 服务(然后将我编写的所有数据库代码都带入其中)?

绝对是的,windows 用 windows 为你服务,现在在容器区域不会那么友好。更重要的是,BackgroundService您可以随意在单个项目上拥有我们希望的任意数量,并且它可以在任何地方运行。

于 2021-10-18T17:05:58.967 回答