使用 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.
我认为这是不正确的,因此您可以在添加作业时直接使用单例类型(TestClass1
、TestClass2
、...)。为此,您还必须注册您的单身人士 AsSelf()
:
builder.RegisterType<TestClass>().AsSelf().As<ITestClass>().SingleInstance();
您仍然可以使用 ITestClass
界面解析所有单例。如果您无法在添加作业的代码中访问单例类型,则必须为每个单例添加一个接口(ITestClass1
、ITestClass2
、...),然后使用这些接口来创建工作。
感谢您的回答 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));
我似乎找不到任何关于此的信息,希望有人能提供帮助。
使用 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.
我认为这是不正确的,因此您可以在添加作业时直接使用单例类型(TestClass1
、TestClass2
、...)。为此,您还必须注册您的单身人士 AsSelf()
:
builder.RegisterType<TestClass>().AsSelf().As<ITestClass>().SingleInstance();
您仍然可以使用 ITestClass
界面解析所有单例。如果您无法在添加作业的代码中访问单例类型,则必须为每个单例添加一个接口(ITestClass1
、ITestClass2
、...),然后使用这些接口来创建工作。
感谢您的回答 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));