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

.NET 8孤立模式V4 Azure Function组件测试:复用Program.cs覆盖DI

.NET 8 孤立模式V4 Azure Function:复用Program.cs并覆盖DI依赖

完全可以复用Program.cs里的DI配置,无需在测试代码中重复编写全部依赖,核心思路是将生产环境的服务配置逻辑抽离为可复用的公共方法,再在测试中基于该配置覆盖特定依赖。

步骤1:重构Program.cs,抽离公共服务配置

将ConfigureServices中的配置逻辑提取为独立的静态方法(或扩展方法),让测试代码可以直接调用:

public class Program
{
    public static void Main()
    {
        var host = new HostBuilder()
            .ConfigureFunctionsWorkerDefaults()
            .ConfigureServices(ConfigureApplicationServices)
            .Build();

        host.Run();
    }

    // 抽离的公共DI配置方法,供测试复用
    public static void ConfigureApplicationServices(IServiceCollection services)
    {
        services.TryAddSingleton<IRepository, MyDatabaseRepo>();
        services.ConfigureFunctionsApplicationInsights();
        services.TryAddSingleton<IValidator, FooValidator>();
    }
}

如果你的Program.cs使用顶级语句(无包裹类),可以把配置逻辑放到单独的静态类中:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(ServiceConfigurations.ConfigureApplicationServices)
    .Build();

host.Run();

public static class ServiceConfigurations
{
    public static void ConfigureApplicationServices(IServiceCollection services)
    {
        services.TryAddSingleton<IRepository, MyDatabaseRepo>();
        services.ConfigureFunctionsApplicationInsights();
        services.TryAddSingleton<IValidator, FooValidator>();
    }
}

步骤2:在测试中复用配置并覆盖依赖

在测试的ServiceProviderBuilder里,先调用公共配置方法加载生产环境的DI设置,再替换需要模拟的依赖:

public static class ServiceProviderBuilder
{
    public static IServiceProvider Create()
    {
        var services = new ServiceCollection();
        
        // 复用生产环境的基础DI配置
        Program.ConfigureApplicationServices(services);
        // 如果是顶级语句重构的情况,调用:ServiceConfigurations.ConfigureApplicationServices(services);
        
        // 覆盖指定依赖:直接替换原有注册
        services.Replace(ServiceDescriptor.Singleton<IRepository, MyFakeRepo>());

        return services.BuildServiceProvider();
    }
}

注:Replace方法需要引用Microsoft.Extensions.DependencyInjection.Abstractions包,若不想引用额外包,也可以手动移除原有注册再添加新实现:

var repoDescriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IRepository));
if (repoDescriptor != null)
{
    services.Remove(repoDescriptor);
}
services.AddSingleton<IRepository, MyFakeRepo>();

优势

  • 避免测试与生产环境DI配置不一致的问题
  • 无需重复编写相同的依赖注册代码
  • 仅需替换测试需要模拟的少量依赖,保持配置一致性

内容的提问来源于stack exchange,提问作者Dr Schizo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:06:12