【问题标题】:How to Setup Hangfire using Asp.Net 4.7 and DI with Microsoft.Extensions.DependencyInjection?如何使用 Asp.Net 4.7 和带有 Microsoft.Extensions.DependencyInjection 的 DI 设置 Hangfire?
【发布时间】:2019-10-03 06:18:26
【问题描述】:

我试图在 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-mvc dependency-injection hangfire


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2020-01-23
      • 2018-08-03
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多