C# 使用ServiceProvider将IServiceProvider注入SignInManager

C# 使用ServiceProvider将IServiceProvider注入SignInManager,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我做了一些研究,关于为手动DI注册标准类的信息并不多。尝试在asp net core 2.1应用程序中实现单元测试时遇到很多问题,下面是最后一个问题。尝试签名UserManager创建的同步用户时出现空引用异常-似乎无法注入IServiceProvider实例 var userManager = Resolve<UserManager<ApplicationUser>>(); await signInManager.SignInAsync(userManager.Find

我做了一些研究,关于为手动DI注册标准类的信息并不多。尝试在asp net core 2.1应用程序中实现单元测试时遇到很多问题,下面是最后一个问题。尝试签名UserManager创建的同步用户时出现空引用异常-似乎无法注入IServiceProvider实例

var userManager = Resolve<UserManager<ApplicationUser>>();
await signInManager.SignInAsync(userManager.FindByIdAsync(adminId), false); // here
我是如何注册依赖项的,到目前为止它一直有效

services.AddDbContext<AppIdentityDbContext>();
var conf = new Mock<IConfiguration>();
services.AddSingleton<IConfiguration>(conf.Object);
services.AddSingleton<IServiceProvider, ServiceProvider>() ; // except for this
services.AddSingleton(services.BuildServiceProvider()); // and this
services.AddScoped<SignInManager<ApplicationUser>> ();
services.AddIdentity<ApplicationUser, IdentityRole>()
       .AddEntityFrameworkStores<AppIdentityDbContext>()
       .AddDefaultTokenProviders();
services.AddScoped<IAuthorizationService, DefaultAuthorizationService> ();
services.AddScoped<IAuthorizationPolicyProvider, DefaultAuthorizationPolicyProvider>();
services.AddScoped<IAuthorizationHandlerProvider, DefaultAuthorizationHandlerProvider>();
services.AddScoped<IAuthorizationHandlerContextFactory, DefaultAuthorizationHandlerContextFactory>();
services.AddScoped<IAuthorizationEvaluator, DefaultAuthorizationEvaluator>();       
services.AddDbContext();
var conf=new Mock();
services.AddSingleton(conf.Object);
services.AddSingleton();//除此之外
services.AddSingleton(services.BuildServiceProvider());//还有这个
services.AddScoped();
服务.额外性()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddScoped();
services.addScope();
services.addScope();
services.addScope();
services.addScope();

有趣的是,UserManager工作得很好

为了注册服务提供商本身,您可以这样做:

services.AddSingleton<IServiceProvider>(sp => sp);
services.AddSingleton(sp=>sp);

这将使用factory函数,您可以使用该函数使用服务提供商
sp
获取实例。由于您想注册服务提供商本身,您可以直接返回
sp

这似乎是一个错误。A应该有助于澄清实际情况problem@Nkosi我理解你的要求,但真的无法提供更多的代码:它只发生在SignInAsync中,仅此而已。您需要澄清当前的问题,因为不清楚您试图描述的是什么问题。@Nkosi我添加了一些我了解的信息。我猜在asp net core项目中插入了一些低级的魔法,这在XUnit项目中是不可用的。
services.AddSingleton<IServiceProvider>(sp => sp);