c# - 如何使用 Asp.Net 4.7 和带有 Microsoft.Extensions.DependencyInjection 的 DI 设置 Hangfire?
问题描述
我试图在 Asp.Net 4.7.2 MVC 应用程序中使用 Hangfire 和 Microsoft.Extensions.DependencyInjection。我有 DI 设置和工作,我似乎无法正确配置 Hangfire。下面的当前实现运行仪表板,但执行后台任务会返回错误:JobActivator 返回了 'Dh.Web.Services.EmailService' 类型的 NULL 实例。
我知道 EmailService 在 DI 中设置正确,因为我可以在调用 BackgroundJob.Enqueue 方法的同一控制器中使用 DI 访问它。
我的实现是:
HangfireActivator.cs
public class HangfireActivator : JobActivator
{
private readonly IServiceProvider _serviceProvider;
public HangfireActivator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public override object ActivateJob(Type type)
{
return _serviceProvider.GetService(type);
}
}
在 startup.cs 中配置Hangfire 方法
private void ConfigureHangfire(IServiceProvider serviceProvider, IAppBuilder app)
{
var hangfireConnString = ConfigurationManager.ConnectionStrings["Dh"].ConnectionString;
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseActivator(new HangfireActivator(serviceProvider))
.UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.FromSeconds(10),
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true,
}
);
app.UseHangfireServer(new BackgroundJobServerOptions {WorkerCount = 3});
var options = new DashboardOptions()
{
Authorization = new[] {new SystemAuthorizationFilter()}
};
app.UseHangfireDashboard("/hangfire",options);
}
最后是 Startup.cs 中的配置方法
public void Configuration(IAppBuilder app)
{
var services = new ServiceCollection();
//App DI
ConfigureServices(services);
var serviceProvider = services.BuildServiceProvider();
var resolver = new DefaultDependencyResolver(serviceProvider);
DependencyResolver.SetResolver(resolver);
//Hangfire
ConfigureHangfire(serviceProvider,app);
}
我怀疑它的路线:var serviceProvider = services.BuildServiceProvider();
那是为我在其中设置所有应用程序 DI 的人创建一个单独的服务提供者,但我不知道如何在没有该行的情况下将 ServiceProvider 设置为 Hangfire 中的 UseActivator 选项......
我真的很感激任何意见。谢谢!
解决方案
我已在我的 DI 中注册:
services.AddTransient<IEmailService,EmailService>();
然而,添加这个来注册没有接口的具体类是有效的。
services.AddTransient<EmailService>();
推荐阅读
- artificial-intelligence - 在 FOL 中表示以下句子:
- android - 如果显示软键盘,则完整布局向上移动
- asp.net - 为什么托管网站无法使用 ip 地址工作,但使用 localhost 工作?
- client-server - 如何使用 Vivado 将 Red Pitaya FPGA 与服务器代码连接起来
- javascript - 如何在 ReactJS 的父组件上设置事件监听器?
- windows - JSch - 无法列出某些具有多字节字符的文件路径
- amazon-redshift - 红移优化:减少 i/o 偏差,还是坚持使用连接中使用的 dist 键?
- javascript - 每次动态更改时重置 element.selectedIndex
- c# - 过滤二维数组的技巧
- python - 如何定向 matplotlib ax 对象以沿时间序列线(affine_transform,mtransform)连续绘制?