如何在Hangfire中使用.net core的默认依赖注入?
我是Hangfire的新手,正在寻找一个与asp.net核心兼容的例子。
解决方法
请参阅GitHub
https://github.com/gonzigonz/HangfireCore-Example上的完整示例。
现场网站于 http://hangfirecore.azurewebsites.net/
现场网站于 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());