You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5 Azure Functions v3 构造函数注入依赖时找不到Job Functions如何解决

问题根因

你当前混用了Azure Functions的进程内运行模型和隔离进程运行模型的API与配置,导致运行时无法识别函数注册,同时依赖注入逻辑不匹配:

  • 你写的Startup类继承FunctionsStartup、使用IFunctionsHostBuilder是进程内模型的依赖注入写法
  • 你的csproj配置里OutputType=Exe、引用Microsoft.Azure.Functions.Worker系列包、Program类使用ConfigureFunctionsWorkerDefaults是隔离进程模型的配置,两类逻辑不兼容导致报错

解决方案

提供两种适配方案,任选其一即可:

方案1:统一使用隔离进程模型(适配你现有csproj配置,推荐)

隔离进程模型原生支持构造函数注入,无需使用FunctionsStartup类:

  1. 删掉现有Startup类及顶部的[assembly: FunctionsStartup]程序集特性
  2. 移除csproj中Microsoft.Azure.Functions.Extensions包引用,该包为进程内模型专用
  3. 修改Program文件,直接在宿主构建链中注册服务:
public class Program
{
    public static void Main()
    {
        IHost host = new HostBuilder()
            .ConfigureFunctionsWorkerDefaults()
            // 在此处注册所有服务,和ASP.NET Core DI写法完全一致
            .ConfigureServices(services =>
            {
                services.AddScoped<IMyRepository, MyRepository>();
            })
            .Build();

        host.Run();
    }
}
  1. 原有函数类的写法不需要修改,保留非静态类、构造函数注入的逻辑即可正常运行

方案2:统一使用进程内模型(适配你现有Startup写法)

如果要沿用FunctionsStartup的注入逻辑,需要修改配置适配进程内模型:

  1. 修改csproj配置:
    • 删掉<OutputType>Exe</OutputType>节点
    • 移除所有Microsoft.Azure.Functions.Worker开头的包引用,替换为进程内对应依赖:
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
        <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Timers" Version="3.0.0" />
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.1.0" />
    </ItemGroup>
    
  2. 删掉现有Program类,进程内模型无需自定义程序入口
  3. 修改函数类的特性与参数适配进程内规范:
public class MyAzureFunction
{
    private readonly IMyRepository _myRepository;

    public MyAzureFunction(IMyRepository myRepository) 
    {
        _myRepository = myRepository;
    }
    // 进程内使用FunctionName特性而非Function
    [FunctionName("MyAzureFunction")]
    public async Task Run([TimerTrigger("0 */15 * * * *")] TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        List<object> result = await _myRepository.GetAllAsync();
        // 后续逻辑...
    }
}
  1. 原有Startup类的服务注册逻辑不需要修改

额外说明

你之前尝试调用的AddTimers方法不需要手动执行,只要安装了对应版本的触发器扩展包,运行时会自动完成注册。

内容的提问来源于stack exchange,提问作者H. Pauwelyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:45:08