使用 Autofac IoC 单例共享接口的 Hangfire 作业

Hangfire jobs utilising Autofac IoC singletons sharing a interface

我似乎找不到任何关于此的信息,希望有人能提供帮助。

使用 class "TestClass" 继承 ITestClass 我可以使用以下代码注册一个 Autofac 单例:

builder.RegisterType<TestClass>().As<ITestClass>().SingleInstance();

向 Hangfire 添加作业同样简单:

RecurringJob.AddOrUpdate<ITestClass>(x => x.MethodInITestClass, Cron.MinuteInterval(1));

我似乎无法弄清楚的是如何将多个 classes 注册为 Autofac 单例 它们都具有相同的接口 并且能够为一个特定的单例。

例如,有一个名为 ITest 的接口和 classes TestClass1、TestClass2 和 TestClass3 使用此接口,我想为 TestClass2 添加一个 Hangfire 作业。

我认为命名单例可能是一个可以轻松创建的解决方案:

builder.RegisterType<TestClass1>().Named<ITest>("TestClass1").SingleInstance();
builder.RegisterType<TestClass2>().Named<ITest>("TestClass2").SingleInstance();
builder.RegisterType<TestClass3>().Named<ITest>("TestClass3").SingleInstance();

但是,为 TestClass2 添加 Hangfire 作业似乎是不可能的,因为 Hangfire 仅将接口作为参数,并且该接口现在有 3 个相关的单例。

我还希望能够将实现此接口的所有单例解析为 IEnumerable,这对于命名单例似乎也是不可能的。

对此有何建议?我猜命名单例可能是死胡同?

我认为命名或键控服务不会在这里帮助您。我查看了 JobActivator 实现,似乎没有办法在解析服务的 ActivateJob(Type jobType) 方法中提供名称或密钥。

However, adding a Hangfire job for TestClass2 seems impossible as Hangfire only takes a interface as an argument and the interface now has 3 related singletons.

我认为这是不正确的,因此您可以在添加作业时直接使用单例类型(TestClass1TestClass2、...)。为此,您还必须注册您的单身人士 AsSelf()

builder.RegisterType<TestClass>().AsSelf().As<ITestClass>().SingleInstance();

您仍然可以使用 ITestClass 界面解析所有单例。如果您无法在添加作业的代码中访问单例类型,则必须为每个单例添加一个接口(ITestClass1ITestClass2、...),然后使用这些接口来创建工作。

感谢您的回答 fknx! :)

我是这样注册的:

builder.RegisterType<TestClass1>().AsSelf().As<ITestClass>().SingleInstance();

builder.RegisterType<TestClass2>().AsSelf().As<ITestClass>().SingleInstance();

builder.RegisterType<TestClass3>().AsSelf().As<ITestClass>().SingleInstance();

.. 将使我能够使用 ITestClass 解决所有这些问题。我看不到的是如何为 TestClass2 注册一个 Hangfirejob?

如果我无法访问单例类型,你提出的解决方案非常有效!

正在注册:

builder.RegisterType<TestClass1>().As<ITestClass1>().As<ITestClass>().SingleInstance();

builder.RegisterType<TestClass2>().As<ITestClass2>().As<ITestClass>().SingleInstance();

builder.RegisterType<TestClass3>().As<ITestClass3>().As<ITestClass>().SingleInstance();

此外,我让 ITestClassX 继承 ITestClass,这样如果我通过 ITestClassX 或 ITestClass 解析,我仍然可以访问相同的方法。

添加 Hangfire 作业:

RecurringJob.AddOrUpdate<ITestClass2>("JobTitle", x => x.DoAJob(), Cron.MinuteInterval(5));