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

WPF中services.BuildServiceProvider()返回null问题求助

问题:services.BuildServiceProvider()为何返回null?

我是WPF应用开发新手,无法理解为何services.BuildServiceProvider()返回null。我原以为执行AppHost声明的代码后,ConfigureServices会构建服务对象,进而在OnStartup方法中_serviceProvider不会为空。

代码示例:

public partial class App : Application
{
    private readonly ServiceProvider _serviceProvider;
    public static IHost? AppHost { get; private set; }

    public App()
    {
        ServiceCollection services = new();
        AppHost = Host.CreateDefaultBuilder()
            .ConfigureServices(ConfigureServices)
            .Build();
        _serviceProvider = services.BuildServiceProvider();
    }
    
    protected void ConfigureServices(HostBuilderContext context, IServiceCollection services)
    {
        services.AddSingleton<IMainViewModel, MainViewModel>();
        services.AddSingleton<MainWindow>();
        // 其他服务注册...
    }
       
    protected override async void OnStartup(StartupEventArgs e)
    {
        ILogger logger = _serviceProvider.GetService<ILogger>()!;
        // 其他启动逻辑...
    
        startupForm.Show();
        base.OnStartup(e);
    }
}

错误原因与解决方法

你核心的问题是混用了两套独立的服务集合:

  • 你手动创建的ServiceCollection services = new();是空的,和Host.CreateDefaultBuilder()内部维护的服务集合完全无关。
  • ConfigureServices方法里注册的服务,是被添加到Host自己的服务集合中,不是你手动创建的那个空集合。
  • 你调用空集合的BuildServiceProvider(),虽然它不会真的返回null,但这个容器里没有任何你注册的服务,后续取服务自然会得到null。

正确的做法是直接从构建完成的AppHost中获取服务提供者:

public App()
{
    AppHost = Host.CreateDefaultBuilder()
        .ConfigureServices(ConfigureServices)
        .Build();
    _serviceProvider = AppHost.Services; // 直接使用Host内置的服务容器
}

另外两个建议:

  • 不要手动调用BuildServiceProvider(),Host已经完成了容器的构建和配置,重复构建会造成资源浪费和逻辑混乱。
  • 获取ILogger时建议指定泛型类型,比如_serviceProvider.GetService<ILogger<App>>(),这样日志会携带具体的类标识,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:29