【问题标题】:Is there a way to run a DI scoped service on a timer with .net core?有没有办法在具有 .net 核心的计时器上运行 DI 范围服务?
【发布时间】:2019-11-03 00:15:23
【问题描述】:

我正在编写一个 .net 核心 web-api 后端并希望运行一个代码,该代码每 4 小时收集一次统计信息并将其写入我的数据库。

为了做到这一点,我需要将我的数据库上下文注入某个方法并使用计时器每 4 小时运行一次,问题是我无法将数据库注入此静态方法。

我尝试过使用 ActivatorUtilities.CreateInstance 但我还是无法获得 IServiceProvider,因为我还需要注入它。

这大致就是我试图定期运行的内容

    public class StatisticsProvider : IStatisticsProvider
    {
        private readonly AppCtx _appCtx;

        public StatisticsProvider(AppCtx appCtx)
        {
            _appCtx = appCtx;
        }

        public void LogStatistics()
        {
            //get data from database and generate statistics 
            //Write statistics to DB
        }
   }

谢谢!

【问题讨论】:

  • 这不是一个好主意。您应该为此使用 HangFire 之类的东西。
  • 在 ASP.NET Core 中,这可以通过托管服务来实现。有关详细信息,请参阅the official documentation
  • @Nkosi 一些带有计时器的静态方法,该方法将每小时运行一次此服务

标签: c# dependency-injection .net-core


【解决方案1】:

类似于Where am I supposed to start persistent background tasks in ASP.NET Core?,您可以利用 HostedServices 定期对您的 .NET Core 应用程序执行例行操作。

需要注意的一点:除了 SO 答案中详述的代码外,对于 .NET Core 2 及更高版本,您应该将其用于 DI

services.AddHostedService<YourHostedService>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多