【问题标题】:Does webjob SDK TimerTrigger support Dependency Injection?webjob SDK TimerTrigger 是否支持依赖注入?
【发布时间】:2023-01-04 22:43:20
【问题描述】:

我正在使用 .net core 6 WebJob SDK 版本 4.0.1:

<PackageReference Include="Microsoft.Azure.WebJobs.Extensions"Version="4.0.1" />

我将以下行添加到我的 webjob 设置代码中:

builder.ConfigureServices(s => s.AddSingleton<MyClass>());

我有一个像这样的定时器触发器:

 public class TimerFunctions
 {
     public void TimerTriggerTest([TimerTrigger("*/5 * * * * *")] TimerInfo myTimer, 
         ILogger logger,
         MyClass diTest
            
         )
     {
         logger.LogInformation("TimerTrigger");
     }
 }

在本地运行我的 WebJob 项目时,出现以下错误:

 System.InvalidOperationException: Cannot bind parameter 'diTest' to type MyClass. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

【问题讨论】:

  • 检查调试器是否命中启动类,并确认您是否在启动代码中添加了 builder.AddTimers()
  • 我做了所有的验证。一旦我删除依赖项注入参数,它就可以正常工作。
  • 关于依赖注入问题的任何更新。是否已解决或仍在寻找解决方案?
  • 我认为 WebJob 的定时器触发器不允许依赖注入。奇怪,因为 Azure Functions 允许这样做,

标签: azure-webjobs azure-webjobssdk azure-webjobs-triggered


【解决方案1】:

是的,Azure WebJobs SDK 中的 TimerTrigger 确实支持依赖注入 (DI)。您可以使用 DI 通过使用 [Inject] 属性将依赖项注入到您的计时器触发器函数中。

例如,您可以使用 DI 将服务或存储库注入到您的计时器触发器函数中,如下所示:

public class MyTimerTrigger
{
    private readonly IMyService _myService;

    public MyTimerTrigger(IMyService myService)
    {
        _myService = myService;
    }

    [FunctionName("MyTimerTrigger")]
    public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
    {
        // Use the injected service here
        await _myService.DoWorkAsync();
    }
}

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多