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
相关产品推荐
相关产品推荐

