0

正如标题所说,我正在尝试从 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();

System.InvalidOperationException

该类型MyApplicaton.Context.MyApplicatonContext不包含带有签名的方法TestString()

System.InvalidOperationException:该类型 MyApplicaton.Context.MyApplicatonContext不包含TestString() 在 Hangfire.Storage.InvocationData.Deserialize()签名的方法

我怎样才能让它工作?

http://docs.hangfire.io/en/latest/background-methods/passing-dependencies.html

4

1 回答 1

0

我知道这似乎有很多额外的麻烦,但您可能应该考虑使用 IoC 容器来管理生命周期,MyApplicationContext然后挂钩 - 请参阅有关将 IoC 容器与 hangfire 一起使用的信息

在推送中,您可以实现自己的JobActivator类(同样,说明在IoC Docs中),但我强烈建议先调查 IoC Container 路线。

于 2015-10-20T13:43:26.190 回答