gpt4 book ai didi

hangfire - 如何使用unity配置hangfire?

转载 作者:行者123 更新时间:2023-12-02 19:58:48 29 4
gpt4 key购买 nike

我有 ASP.NET Web API 应用程序。该应用程序使用 Unity 作为 IoC 容器。该应用程序也在使用 Hangfire,我正在尝试配置 Hangfire 以使用 Unity。

所以基于documentation我正在使用Hangfire.Unity它将 Unity 容器注册为 Hangfire 中的当前作业激活器。

我有一个依赖于IBackgroundJobClient的类

 public class MyService
{
private MyDBContext _dbContext = null;
private IBackgroundJobClient _backgroundJobClient = null;

public MyService(MyDbContext dbContext, IBackgroundJobClient backgroundJobClient)
{
_dbContext = dbContext;
_backgroundJobClient = backgroundJobClient;
}
}

但是,即使在配置 Hangfire.Unity 之后,它也无法创建和传递 BackgroundJobClient 的实例

所以我必须使用 Unity 容器注册 BackgroundJobClient 的每个依赖项。

统一注册

public class UnityConfig
{

private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});


public static IUnityContainer GetConfiguredContainer()
{
return container.Value;
}

public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<MyDbContext>(new HierarchicalLifetimeManager(), new InjectionFactory(x => new MyDbContext()));

// register hangfire dependencies
container.RegisterType<IBackgroundJobClient, BackgroundJobClient>();
container.RegisterType<JobStorage, SqlServerStorage>(new InjectionConstructor("HangfireConnectionString"));
container.RegisterType<IJobFilterProvider, JobFilterAttributeFilterProvider>(new InjectionConstructor(true));
container.RegisterType<IBackgroundJobFactory, BackgroundJobFactory>();
container.RegisterType<IRecurringJobManager, RecurringJobManager>();
container.RegisterType<IBackgroundJobStateChanger, BackgroundJobStateChanger>();
}

}

OWIN 初创公司

    public class Startup
{
public void Configuration(IAppBuilder app)
{
var container = UnityConfig.GetConfiguredContainer();


Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("HangfireConnectionString");
Hangfire.GlobalConfiguration.Configuration.UseUnityActivator(container);

// if i dont call UseSqlServerStorage() above then UseHangfireDashboard() method fails with exception
//JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

app.UseHangfireDashboard();
app.UseHangfireServer();

RecurringJob.AddOrUpdate<MyService>(x => x.Prepare(), Cron.MinuteInterval(10));
}
}

代码正在使用这样的配置。不过我有疑问:

这是使用 Hangfire 配置 Unity 的正确方法吗?

为什么我需要在 OWIN 启动中调用 Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("HangfireConnectionString") 即使 SqlServerStorage 已经在 Unity 容器中注册为 作业存储

如果我不在 OWIN 启动中调用 UseSqlServerStorage() 方法,那么我会在 app.UseHangfireDashboard() 方法上遇到异常。

JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

最佳答案

我认为存在一个问题,即您想要在 Unity 生态系统之外启动 Hangfire,但又希望 Unity 了解如何使用关联的实现来实例化适当的 Hangfire 接口(interface)。由于 Hangfire 本身不使用 Unity,因此您需要使用适当的配置(例如 SQL Server 连接字符串)启动 Hangfire,然后使用该配置通知 Unity 如何实例化 Hangfire 接口(interface)。我能够通过为 SQL 设置全局 Hangfire 配置,然后使用相同的 Hangfire 静态实例来设置 Unity 来解决这个问题。

这是示例代码,首先您将看到我如何使用连接字符串启动hangfire仪表板和服务器:

public void Configuration(IAppBuilder app)
{
var configuration = new Configuration(); // whatever this is for you

GlobalConfiguration.Configuration.UseSqlServerStorage(
configuration.GetConnectionString());

GlobalConfiguration.Configuration.UseActivator(
new HangfireContainerActivator(UnityConfig.GetConfiguredContainer()));

app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] {new HangfireAuthorizationFilter()}
});
app.UseHangfireServer();
}

作为第二个示例,这是 Hangfire 的 Unity 配置;请注意此代码如何使用静态 JobStorage Hangfire 对象来实例化对 JobStorage 的任何请求。

    public static void RegisterHangfire(IUnityContainer container)
{
container.RegisterType<JobStorage>(new InjectionFactory(c => JobStorage.Current));
container.RegisterType<IJobFilterProvider, JobFilterAttributeFilterProvider>(new InjectionConstructor(true));
container.RegisterType<IBackgroundJobFactory, BackgroundJobFactory>();
container.RegisterType<IRecurringJobManager, RecurringJobManager>();
container.RegisterType<IBackgroundJobClient, BackgroundJobClient>();
container.RegisterType<IBackgroundJobStateChanger, BackgroundJobStateChanger>();
}

我相信这种方法可以让您两全其美,您只需设置一次 SQL Server 连接,并且尽早启动 Hangfire,然后使用该实例来告诉 Unity 如何运行。

关于hangfire - 如何使用unity配置hangfire?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155342/

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