在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

在Hangfire后台作业c# Web Mvc中的单例调用方法

我知道这似乎有很多额外的麻烦,但你可能应该考虑使用IoC容器来管理MyApplicationContext的生命周期,然后挂钩到它-参见使用IoC容器与hangfire的信息。

在推动下,您可以实现自己的JobActivator类(再次,说明在IoC文档中),但我强烈建议先调查IoC容器路由。