Hangfire 在运行时在作业范围内注册 IoC 依赖项

问题描述 投票:0回答:1

问题:大多数作业都依赖于配置依赖性。

理想的解决方案:(如果您已经确切知道如何执行此操作,则复制此处和最后只是为了节省阅读)

我愿意

  • 在作业 Q 期间(使用过滤器或任何其他选项)保存一些数据(对象/json/字符串)
  • 在作业处理期间:拦截作业的创建过程,并使用该作业范围内 IoC 容器的隐藏数据来注册依赖关系

旧解决方案:对于我要替换的自定义“作业调度程序”,我们采取以下步骤

  • 在解析作业处理器之前,我们创建一个生命周期范围并使用作业数据注册与提供的数据的依赖关系
  • 然后使用“作业类型”解决作业和流程

黑客解决方案:所以这对大多数人来说都有效,但我仍然想知道如何通过创建一个“包装作业”类来完成我想要做的事情,该类在运行作业时使用相同的数据来创建相同的范围。

理想解决方案:理想情况下我可以注入逻辑并且

  • 在保存所需数据期间(有很多方法可以做到这一点)
  • 在预作业处理期间访问 IoC 以创建范围注册此依赖项

我已经尝试/查看了过滤器属性 - 用于保存和恢复数据,但没有在这里找到任何对 IoC 或生命周期范围的访问。

还有一些其他选项,但它们也仅限于“暴露”到 IoC 容器/范围

理想的解决方案: 我愿意

  • 在作业 Q 期间(使用过滤器或任何其他选项)保存一些数据(对象/json/字符串)
  • 在作业处理期间:拦截作业的创建过程,并使用该作业范围内 IoC 容器的隐藏数据来注册依赖关系
dependency-injection inversion-of-control ioc-container hangfire hangfire-autofac
1个回答
0
投票

哇我很密集,所以查看[委托工厂](委托工厂)文档并深入研究隐式关系类型

我意识到我让这件事变得比需要的要困难得多,我正在寻找的是这里清楚地记录了但我从来没有仔细观察过所以这里是一个工作示例

  public class ScratchPad
  {
      [Fact]
      public void WhenRunningThisThenItWorks()
      {
          var builder = new ContainerBuilder();
          builder.RegisterType<MyNeedyRuntimeClass>();
          builder.RegisterType<SomethingElseNeeded>();
          var container = builder.Build();

          var theFuncFactory = container.Resolve<Func<SomeRuntimeThing, MyNeedyRuntimeClass>>();
          var func = () => theFuncFactory.Invoke(new SomeRuntimeThing());
          func.Should().NotThrow("constructor need for `SomeRuntimeThing` should be passed in from Func and dependency for `SomethingElseNeeded` is handled from the service registration");
      }
  }

这是我仅供参考的空类

  class MyNeedyRuntimeClass
  {
      public MyNeedyRuntimeClass(SomeRuntimeThing someRuntimeIdOrSomething, SomethingElseNeeded bar)
      {
          //....
      }
  }

  internal class SomeRuntimeThing
  {
  }

  internal class SomethingElseNeeded
  {
  }
© www.soinside.com 2019 - 2024. All rights reserved.