加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 使用.net核心进行Hangfire依赖注入

发布时间:2020-12-16 00:21:05 所属栏目:asp.Net 来源:网络整理
导读:如何在Hangfire中使用.net core的默认依赖注入? 我是Hangfire的新手,正在寻找一个与asp.net核心兼容的例子。 解决方法 请参阅GitHub https://github.com/gonzigonz/HangfireCore-Example上的完整示例。 现场网站于 http://hangfirecore.azurewebsites.net/
如何在Hangfire中使用.net core的默认依赖注入?

我是Hangfire的新手,正在寻找一个与asp.net核心兼容的例子。

解决方法

请参阅GitHub https://github.com/gonzigonz/HangfireCore-Example上的完整示例。
现场网站于 http://hangfirecore.azurewebsites.net/

>确保您拥有Hangfire的核心版本:
dotnet添加包Hangfire.AspNetCore
>通过定义JobActivator配置IoC。以下是与默认的asp.net核心容器服务一起使用的配置:

public class HangfireActivator : Hangfire.JobActivator
{
    private readonly IServiceProvider _serviceProvider;

    public HangfireActivator(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public override object ActivateJob(Type type)
    {
        return _serviceProvider.GetService(type);
    }
}

>接下来将Startfire注册为Startup.ConfigureServices方法中的服务:

services.AddHangfire(opt => 
    opt.UseSqlServerStorage("Your Hangfire Connection string"));

>在Startup.Configure方法中配置hangfire。与您的问题相关,关键是配置hangfire以使用我们上面定义的新HangfireActivator。为此,您必须使用IServiceProvider提供hangfire,这可以通过将其添加到Configure方法的参数列表来实现。在运行时,DI将为您提供此服务:

public void Configure(
    IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory,IServiceProvider serviceProvider)
{
    ...

    // Configure hangfire to use the new JobActivator we defined.
    GlobalConfiguration.Configuration
        .UseActivator(new HangfireActivator(serviceProvider));

    // The rest of the hangfire config as usual.
    app.UseHangfireServer();
    app.UseHangfireDashboard();
}

>当您将作业排队时,请使用通常是您的界面的注册类型。除非您以这种方式注册,否则请勿使用具体类型。您必须使用在您的IoC其他Hangfire中注册的类型才能找到它。
例如,您已经注册了以下服务:

services.AddScoped<DbManager>();
services.AddScoped<IMyService,MyService>();

然后,您可以使用该类的实例化版本将DbManager排入队列:

BackgroundJob.Enqueue(() => dbManager.DoSomething());

但是你不能对MyService做同样的事情。使用实例化版本进行排队将失败,因为DI将失败,因为只有接口已注册。在这种情况下,你会像这样排队:

BackgroundJob.Enqueue<IMyService>( ms => ms.DoSomething());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读