首页 > 解决方案 > 如何使用 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 选项......

我真的很感激任何意见。谢谢!

标签: c#asp.net-mvcdependency-injectionhangfire

解决方案


我已在我的 DI 中注册: services.AddTransient<IEmailService,EmailService>();

然而,添加这个来注册没有接口的具体类是有效的。 services.AddTransient<EmailService>();


推荐阅读