【问题标题】:Best approach to a class that would run in background polling other API and saving data在后台轮询其他 API 并保存数据的类的最佳方法
【发布时间】:2019-07-02 17:05:34
【问题描述】:

所以我有一个用 .NET Core C# 编写的网站,我想在后台运行一个进程,该进程将对其他网站进行 API 调用并将数据保存在数据库中。

我已经创建了 ApiAccessor 类并想从控制器调用该方法(它使用依赖注入来连接它的数据库),但是如果我将它们传递给 ApiAccessor(它将是异步的),则连接已经被处理掉了。我已经尝试从一开始就注入它,但它仍然会说接口已被释放,当它完成时。我只能等待它,但这会导致用户等待太久。我应该采取什么方法呢?我是 DI 的新手。也许一些单例类?我仍然不知道如何将依赖注入传递给单例

ApiAccessor:

IUserAccount _userAccounts;

public ApiAccessor(IConfiguration configuration, IUserAccount userAccounts)
{
   _configuration = configuration;
   _userAccounts = userAccounts;
}

//...

MethodToPollApi(){

   var newUserIdToAdd = // just some kind of new data from api
   _userAccounts.Add(newUserIdToAdd) // accessing DB, that causes errors 

}

控制器:

void Index(){
  MethodToPollApi(); 
  return View();
}

【问题讨论】:

  • 控制器的目的是提供对请求的响应。一旦它做出响应,它的工作就完成了。从控制器方法运行它没有意义。如果 Index 被访问 100 次怎么办?您将有 100 个进程轮询 API。
  • 我不认为你需要担心它,它可以检查时间等,我只需要执行一段代码来轮询 API,控制器将控制时间事件。我只需要控制器传递信息,数据库中的轮询+保存将由访问器类执行

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


【解决方案1】:

我会考虑使用称为background jobs 的想法。此类解决方案有一些流行的框架。其中:基于IHostedServiceQuartz.NETHangfiremany more 的自定义实现可用。

我曾经和他们中的许多人一起玩,个人更喜欢Hangfire,因为它是自引导的,为作业仪表板提供了漂亮的 UI,并且非常易于使用 - 例如,这就是触发作业灯的样子:

立即运行一次:

var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));

运行延迟:

BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));

重复运行:

var jobId = RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"), Cron.Daily);

拿起完成的工作并继续:

BackgroundJob.ContinueWith(jobId, () => Console.WriteLine("Continuation!"));

【讨论】:

  • 是的,我有它,但我如何让它访问数据库?
【解决方案2】:

继续@Dmitry 的回答。使用 Hangfire,您可以执行以下操作。

services.AddHangfire(x => x.UseSqlServerStorage("<Your connection string>"));

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2013-01-08
    • 2013-08-27
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多