Azure Function App添加Startup文件用于DI的配置疑问
Azure Function Startup文件与依赖注入配置疑问
我知道可以给Azure Function App添加Startup文件来实现依赖注入(DI)。目前没有Startup文件时所有功能都正常运行,想请教:
- 怎么确定Startup文件里需要配置哪些内容?
- 逻辑上空的Startup文件应该也能正常运行,但创建之后,是不是需要手动添加之前自动注入的依赖项?
附上我的项目文件和函数代码:
csproj文件内容
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> </PropertyGroup> <ItemGroup> <PackageReference Include="IdentityModel" Version="5.2.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.9"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.3" /> <PackageReference Include="RT.Comb" Version="2.5.0" /> <PackageReference Include="SharpZipLib" Version="1.3.3" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup> <ItemGroup> <Folder Include="Migrations\" /> </ItemGroup> </Project>
函数代码片段
[FunctionName("MyFunc")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
解答
1. 确定Startup需配置的内容
你只需要在Startup里配置自己需要通过DI注入的自定义服务,以及需要覆盖或扩展的内置服务:
- 自定义服务:比如你的DbContext、业务逻辑类、第三方SDK实例等,这些原本是在函数里手动
new的,现在要改成DI注入的,就需要在ConfigureServices里注册。 - 扩展内置服务:比如修改日志配置、添加自定义中间件,或者替换内置服务的实现(比如自定义
ILoggerProvider)。
如果只是想用DI简化代码,就把那些重复实例化的类注册进去就行,不需要动原本自动工作的部分。
2. 创建Startup后是否需要手动添加自动注入项
不需要手动添加原本自动注入的依赖项。Azure Functions runtime会自动注册以下核心服务,不管有没有Startup文件:
ILogger、ILogger<T>HttpRequest、HttpResponseExecutionContext- 配置相关的
IConfiguration
空的Startup文件完全可以正常运行,它只是扩展DI容器的入口,不会覆盖runtime的自动注册逻辑。
针对你的项目的具体建议
你的项目用到了Entity Framework Core,所以在Startup里最核心的配置就是注册DbContext:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; [assembly: FunctionsStartup(typeof(YourNamespace.Startup))] namespace YourNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 从配置里读取连接字符串 string connectionString = builder.GetContext().Configuration.GetConnectionString("YourDbConnection"); // 注册DbContext builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(connectionString)); // 如果还有其他自定义服务,比如业务逻辑类,也在这里注册 // builder.Services.AddScoped<IMyBusinessService, MyBusinessService>(); } } }
之后你就可以把函数改成非静态类,通过构造函数注入DbContext和其他服务:
public class MyFunc { private readonly YourDbContext _dbContext; private readonly ILogger<MyFunc> _logger; // 构造函数注入 public MyFunc(YourDbContext dbContext, ILogger<MyFunc> logger) { _dbContext = dbContext; _logger = logger; } [FunctionName("MyFunc")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req) { // 直接使用注入的_dbContext和_logger // ... } }
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

