gpt4 book ai didi

c# - 如何使用 Asp.Net 4.7 和带有 Microsoft.Extensions.DependencyInjection 的 DI 设置 Hangfire?

转载 作者:行者123 更新时间:2023-12-05 06:23:35 27 4
gpt4 key购买 nike

我正在尝试在 Asp.Net 4.7.2 MVC 应用程序中将 Hangfire 与 Microsoft.Extensions.DependencyInjection 结合使用。我有 DI 设置和工作,我似乎无法正确配置 Hangfire。下面的当前实现运行仪表板,但执行后台任务会返回错误:JobActivator 返回了“Dh.Web.Services.EmailService”类型的 NULL 实例。

我知道 EmailService 已在 DI 中正确设置,因为我可以在调用 BackgroundJob.Enqueue 方法的同一 Controller 中使用 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>();

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

关于c# - 如何使用 Asp.Net 4.7 和带有 Microsoft.Extensions.DependencyInjection 的 DI 设置 Hangfire?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com