【问题标题】:Hangfire dependency injection with ASP.NET core: inject different objects when processing a hangfire Job使用 ASP.NET 核心的 Hangfire 依赖注入:在处理 Hangfire 作业时注入不同的对象
【发布时间】:2021-03-13 20:12:43
【问题描述】:

我有一个使用标准 .net 依赖注入的 asp.net 5 Web 应用程序。据我了解,开箱即用的Hangfire 将使用与MVC 将用于控制器等的相同依赖项来实例化作业。我想在实例化作业时注入不同的依赖项。我该怎么做?

例如有些类依赖于IHttpContextAccessor,所以我想提供一个替代方案,用于在hangfire 作业中使用,它将从序列化的作业参数中获取其状态。

我看到一些关于复杂事物的讨论 here,听起来像是我需要的……但我喜欢一个简单的例子 :-)

【问题讨论】:

  • 您想使用提供者或工厂模式。看看这个答案。 stackoverflow.com/a/44177920/860539
  • 我会说你应该避免在直接请求处理之外(在控制器之外)使用面向 web 上下文的 IHttpContextAccessor。您的控制器应该构建一个 Poco 以传递给业务处理类,这与通过 hangfire 调用时传递的参数相同。无论如何,如果更改业务代码不是一个可行的选择,我会尝试装饰 IHttpContextAccessor,当装饰的访问器没有提供 httpcontext 时提供我自己的实现。 andrewlock.net/…
  • 根据你想从 IHttpContextAccessor 传递的上下文信息,你也可以使用过滤器stackoverflow.com/a/57396553/1236044

标签: asp.net-core hangfire asp.net-core-5.0


【解决方案1】:

我最终没有使用依赖注入来实现这种不同的行为。相反,我更改了使用 IHttpContentAccessor 的类,以便从我的 Hangfire 作业方法中设置的状态中派生“租户”。

  • 在我的作业方法中,我首先根据作业方法的参数将租户设置在“Scoped”对象中
  • 在使用IHttpContentAccessor 从当前请求中获取信息的类中,我首先查看当前是否有获取租户信息的请求,如果没有,则检查仅在hangfire 作业期间设置的范围对象。李>
  • 在我的工作方法中,我不使用构造函数依赖注入。相反,我在作业方法中使用服务定位器(反)模式。这意味着我可以先设置租户状态,然后再请求依赖它的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多