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

前端之家收集整理的这篇文章主要介绍了asp.net-core – 使用.net核心进行Hangfire依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在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());

猜你在找的asp.Net相关文章