- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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/
我有一个非常复杂的 sql 脚本来清理我的数据库,并且会不时手动运行。脚本运行后,我必须立即启动一个经常性的 hangfire 作业,该作业通常每天只执行一次。 为了不忘记运行脚本,我想直接从sql脚
我有 2 个 hangfire 实例/服务器在运行。两者都指向同一个 hangfire 数据库。如何限制其中一个 hangfire 实例仅从特定队列中获取作业并忽略其他队列? 谢谢 最佳答案 启动实例
我有 2 个 hangfire 实例/服务器在运行。两者都指向同一个 hangfire 数据库。如何限制其中一个 hangfire 实例仅从特定队列中获取作业并忽略其他队列? 谢谢 最佳答案 启动实例
我在使用相同数据库的两台服务器上运行了几个 Hangfire 实例。每个实例根据基于服务器名称的某些标准提交要运行的作业,以便没有两个实例运行相同的作业。我注意到它们正在运行相同的作业,这意味着当一个
nuget 包之间有什么区别 HangFire.AspNetCore和 HangFire和 HangFire.core ? 看来我可以将 hangfire 与 ASP .NET MVC Core 项目
我是 hangfire 的新手,我正在尝试设置一种方法来使用我现有的 serilog 记录器在 asp.net web api 中记录事件。这是我的记录器类: public static class
出于冗余原因,我需要使用相同的数据库运行同一服务的多个实例。 我发现了一些关于“Hangfire 多个实例”的问题,但出于不同的目的,然后是我的:通常是关于在同一数据库上为不同的任务运行多个实例,或与
此 documentation说你可以使用 Queue 指定一个队列要调用的方法的属性。这假设您总是希望在同一个队列上执行一个方法。调用 Enqueue 的进程有没有办法指定将作业放入的队列名称(有效
我有一个现有的 api,它按线程存储数据,并使用 HttpContext.Current 进行检索。 . 我正在尝试重构这个类以从 hangfire 作业中调用——我想知道是否有一个等效的静态方法来检
迁移到 asp.net core 2.1 破坏了我们的 Hangfire 作业设置。 在 Program.cs 的 Main 方法中,我们有类似的内容 var webHost = BuildWebHo
根据 hangfire documentation Starting from Hangfire 1.3.0, you are not required to do anything, if your
我刚刚开始使用Hangfire,现在我很喜欢它。 我了解到,Hangfire将成功工作的历史记录保留了1天,之后将其清除。 有没有一种方法可以自定义此默认行为并将历史记录保留任何持续时间(例如7天)?
我们的网络应用程序允许最终用户在 UI 上设置重复作业的队列。 (我们为每个服务器创建一个队列(使用服务器名称)并允许用户选择要运行的服务器)作业的注册方式: RecurringJob.AddOrUp
我有一个应用程序,具有 Multi-Tenancy 。我想在用户上下文下创建后台作业,但我找不到实现它的好方法。 我将解释一下我的架构。我正在使用包含 UserID 的接口(interface) IC
我想将 QUARTZ 作业转换为 hangfire 我有一个带有 Execute 方法的类。 如何在Hangfire中调用该方法。我尝试类似的事情 public static string CRON_
当使用 Hangfire 排队和处理后台作业时,我能够导致发生可重现的内存不足异常。 . 这些作业是简单的 Console.WriteLine 调用,因此我不希望堆内存以这种方式增加。 我的配置是否不
我有 ASP.NET Web API 应用程序。该应用程序使用 Unity 作为 IoC 容器。该应用程序也在使用 Hangfire,我正在尝试配置 Hangfire 以使用 Unity。 所以基于d
从 1.7.8 版本开始,可以将结果从父作业传递到 Hangfire 中的延续作业。但是没有提供文档或示例。在浏览代码时,我意识到我需要使用带有 pushResults: true 参数的 Conti
有没有人使用过 Hangfire 的多个实例? (在不同的应用程序中)使用相同的 SQL DB 进行配置。因此,我不想为每个 hangfire 实例创建新的 SQL 数据库,而是想与多个实例共享同一个
从 1.7.8 版本开始,可以将结果从父作业传递到 Hangfire 中的延续作业。但是没有提供文档或示例。在浏览代码时,我意识到我需要使用带有 pushResults: true 参数的 Conti
我是一名优秀的程序员,十分优秀!