在Hangfire后台作业c# Web Mvc中的单例调用方法
本文关键字:单例 调用 方法 Mvc Hangfire 后台作业 Web | 更新日期: 2023-09-27 18:09:15
正如标题所说,我试图调用驻留在Hangfire后台作业的Singleton实例中的方法。我尝试使用下面的代码对作业进行排队,但它们都不起作用:
BackgroundJob.Enqueue<MyApplicatonContext>(x => x.TestString());
BackgroundJob.Enqueue(() => MyApplicatonContext.Instance.TestString());
我的单例类是这样的:
public sealed class MyApplicatonContext
{
// Singleton instance
private readonly static Lazy<MyApplicatonContext> _instance = new Lazy<MyApplicatonContext>(() => new MyApplicatonContext(GlobalHost.ConnectionManager.GetHubContext<MyApplicatonHub>().Clients));
private readonly string _testString = "It works!";
private IHubConnectionContext<dynamic> Clients
{
get;
set;
}
private MyApplicatonContext (IHubConnectionContext<dynamic> clients)
{
Clients = clients;
}
public static MyApplicatonContext Instance
{
get
{
return _instance.Value;
}
}
public string TestString()
{
return _testString;
}
}
Hangfire然后生成这个作业和错误:
using MyApplicaton.Context;
MyApplicatonContext context = Activate<MyApplicatonContext>();
context.TestString();
系统。InvalidOperationException
类型
MyApplicaton.Context.MyApplicatonContext
不包含方法签名为TestString()
系统。InvalidOperationException:类型
MyApplicaton.Context.MyApplicatonContext
中没有方法签名TestString()
atHangfire.Storage.InvocationData.Deserialize ()
我怎样才能使它工作?
http://docs.hangfire.io/en/latest/background-methods/passing-dependencies.html我知道这似乎有很多额外的麻烦,但你可能应该考虑使用IoC容器来管理MyApplicationContext
的生命周期,然后挂钩到它-参见使用IoC容器与hangfire的信息。
在推动下,您可以实现自己的JobActivator
类(再次,说明在IoC文档中),但我强烈建议先调查IoC容器路由。