我正在尝试使用一个在数据库中添加用户的web api,所以我创建了这个启动类:
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>();
}
但是我得到了这个异常:系统。参数不能为空。参数名称:provider'
首先,你应该在注册SignUpViewModel之前初始化service provider,因为Resolve方法在自己内部使用serviceProvider。可能你在代码中使用了Resolve方法。需要检查代码
在xamwebapicclient/App.xaml.cs中,查看构造函数:
public App()
{
InitializeComponent();
Startup.ConfigureServices(); <-- Do you have this line?
MainPage = new AppShell();
}
在设置MainPage
之前调用Startup.ConfigureServices();
。
设置了serviceProvider
,所以应该修复null异常。
解释:"Resolve"被调用以查找HTTPClient所需的任何服务的实现。
在您的情况下,其他地方的代码可能指的是IUserServices
?
ConfigureServices
必须在代码尝试使用IUserServices
之前被调用。
重要:如果您使用了其他服务,但没有在ConfigureServices
中声明,那么您仍然会在Resolve
行中获得空异常。在这种情况下,在VS调用堆栈中找到显示"服务"的行。
ConfigureServices
将需要另一个services.AddHttpClient<ISomeService, ...
来提供该服务。(将ISomeService
替换为定义该服务的任何接口)