System.ArgumentNullException: 'Value cannot be null. Parameter name: provider'

System.ArgumentNullException: 'Value cannot be null. Parameter name: provider'

我正在尝试使用一个在数据库中添加用户的网络 api,所以我创建了这个启动程序 class:

    public static class Startup
    {
        private static IServiceProvider serviceProvider;
        public static void ConfigureServices()
        {
            var services = new ServiceCollection();
            //add services
            services.AddHttpClient<IUserServices, ApiUserServices>(c => 
            {
                c.BaseAddress = new Uri("http://10.0.2.2:9129/api/");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
            });

            //add viewmodels
            services.AddTransient<SignUpPageViewModel>();

            serviceProvider = services.BuildServiceProvider();
        }
  

        public static T Resolve<T>() => serviceProvider.GetService<T>();

    }

但是我得到了这个例外: System.ArgumentNullException: 'Value cannot be null. Parameter name: provider'

首先,您应该在注册 SignUpViewModel 之前初始化服务提供者,因为 Resolve 方法在其内部使用了 serviceProvider。可能您在代码中使用了 Resolve 方法。需要检查您的代码

XamWebApiClient / App.xaml.cs中,看构造函数:

        public App()
        {
            InitializeComponent();

            Startup.ConfigureServices();   <-- Do you have this line?
          
            MainPage = new AppShell();
        }

Startup.ConfigureServices();在设置MainPage之前被调用。

这设置了 serviceProvider,所以应该修复 null 异常。

解释:“解析”被调用以查找 HTTPClient 所需的任何服务的实现。

在您的情况下,其他地方的代码可能指的是 IUserServices?

ConfigureServices 必须在该代码尝试使用 IUserServices.

之前调用

重要提示:如果您使用了其他服务,但未在 ConfigureServices 中声明,那么您仍然会在 Resolve 行上得到一个空异常。在这种情况下,在 VS Call Stack 上找到显示要求“服务”的行。

ConfigureServices 将需要另一个 services.AddHttpClient<ISomeService, ... 来提供该服务。 (将 ISomeService 替换为定义该服务的任何接口。)