Azure Function集成Entity Framework时webjobsbuilderextensions.cs缺失如何解决
Azure Function完全支持你当前使用的分层架构,你遇到的webjobsbuilderextensions.cs not found错误和分层设计无关,是Entity Framework Core与Azure Functions运行时的依赖版本不兼容、以及DbContext注入方式适配不当导致的。
你可以按照以下步骤解决问题:
- 统一所有项目的EF Core版本
如果你使用的是Azure Functions v4 进程内运行模型,所有项目引用的Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer版本不得高于6.x,进程内运行时对EF Core高版本的兼容性存在限制,版本不匹配会直接触发找不到WebJobs相关扩展文件的错误。如果你使用的是隔离进程运行模型,需保证三层项目中所有EF Core相关依赖的版本完全一致,避免跨项目版本差引发依赖冲突。 - 调整DbContext注入逻辑
Azure Functions的服务生命周期规则与普通ASP.NET Core项目有差异,不要将DbContext的生命周期设置为Transient,推荐调整为Scoped,同时将接口和实现类的注册拆分,避免内置DI解析时出现生命周期不匹配问题,把你Infrastructure层的AddPersistence方法修改为如下写法:public static class Injections { public static IServiceCollection AddPersistence(this IServiceCollection services, string connectionString) { services.AddTransient<ISalesItemDataService, SalesItemDataService>(); services.AddDbContext<OnePlmSubContext>( options => options.UseSqlServer(connectionString), ServiceLifetime.Scoped, ServiceLifetime.Scoped); services.AddScoped<IOnePlmSubContext>(sp => sp.GetRequiredService<OnePlmSubContext>()); return services; } } - 调整DbContext调用方式
如果是进程内运行模型,不要在Function类的构造函数中注入DbContext,构造函数属于单例生命周期,直接注入Scoped的DbContext会导致服务释放异常,改为在Function触发方法中通过[FromServices]参数注入:[FunctionName("YourFunctionName")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, [FromServices] IOnePlmSubContext dbContext) { // 业务逻辑 }
做完以上调整即可解决报错问题,不需要修改现有的分层架构。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

