【问题标题】:Hangfire jobs utilising Autofac IoC singletons sharing a interface使用 Autofac IoC 单例共享接口的 Hangfire 作业
【发布时间】:2017-01-09 20:18:27
【问题描述】:

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

使用继承 ITestClass 的类“TestClass”,我可以使用以下代码注册 Autofac 单例:

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

向 Hangfire 添加工作同样简单:

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

我似乎想不通的是如何将多个类注册为 Autofac 单例都具有相同的接口并能够为特定的单例创建 Hangfire 作业。

例如,有一个名为 ITest 的接口和使用此接口的类 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,这对于命名单例来说似乎也是不可能的。

对此有何建议?我猜命名单例可能是死路一条?

【问题讨论】:

    标签: asp.net model-view-controller singleton autofac hangfire


    【解决方案1】:

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

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

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

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

    您仍然可以使用ITestClass 接口解析所有单例。如果您在添加作业的代码中无权访问单例类型,则必须为每个单例添加一个接口(@98​​7654328@,ITestClass2,...),然后将这些接口用于创造就业机会。

    【讨论】:

      【解决方案2】:

      感谢您的回答 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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        相关资源
        最近更新 更多