.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类:
- 删掉现有
Startup类及顶部的[assembly: FunctionsStartup]程序集特性 - 移除csproj中
Microsoft.Azure.Functions.Extensions包引用,该包为进程内模型专用 - 修改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(); } }
- 原有函数类的写法不需要修改,保留非静态类、构造函数注入的逻辑即可正常运行
方案2:统一使用进程内模型(适配你现有Startup写法)
如果要沿用FunctionsStartup的注入逻辑,需要修改配置适配进程内模型:
- 修改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> - 删掉
- 删掉现有Program类,进程内模型无需自定义程序入口
- 修改函数类的特性与参数适配进程内规范:
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(); // 后续逻辑... } }
- 原有Startup类的服务注册逻辑不需要修改
额外说明
你之前尝试调用的AddTimers方法不需要手动执行,只要安装了对应版本的触发器扩展包,运行时会自动完成注册。
内容的提问来源于stack exchange,提问作者H. Pauwelyn
相关产品推荐
相关产品推荐

