Dependency injection DbContext和ASP.net核心标识服务似乎是单例的,而不是文档中描述的范围
在我的startup.cs文件的Dependency injection DbContext和ASP.net核心标识服务似乎是单例的,而不是文档中描述的范围,dependency-injection,asp.net-core,asp.net-identity,asp.net-core-identity,Dependency Injection,Asp.net Core,Asp.net Identity,Asp.net Core Identity,在我的startup.cs文件的ConfigureServices函数中,我对我的数据上下文进行了以下设置: services.AddDbContext<MyDbContext>(options => { options.UseSqlServer("Connection string"); }); services.AddDbContext(选项=> { options.UseSqlServer(“连接字符串”); }); 然后为它设置身份服务
ConfigureServices
函数中,我对我的数据上下文进行了以下设置:
services.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer("Connection string");
});
services.AddDbContext(选项=>
{
options.UseSqlServer(“连接字符串”);
});
然后为它设置身份服务
services.AddIdentity<MyUser, MyRole>()
.AddEntityFrameworkStores<MyDbContext, int>()
.AddDefaultTokenProviders();
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
一切都与DI一起工作。我能够从我的控制器访问MyDbContext
和UserManager
,并获得我需要的数据
我也有这样的印象(正如我所读到的),我会为每个请求获得一个新的MyDbContext
实例。我不认为会发生这种情况MyDbContext
似乎是一个单例
在服务器A中,我运行以下命令:await userManager.CheckPasswordAsync(aUser,“theirCurrentPassword”)代码>
当我找到用户并且他们的密码正确时,它返回true
在服务器B上,我指向相同的数据上下文,并使用标识服务。在服务器B上,我运行wait userManager.ChangePasswordAsync(类似用户,“他们的当前密码”,“他们的新密码”)
。我知道这个函数可以工作并识别更改,因为当我再次运行它(从服务器B内部)时,它会给我一个错误,告诉我“theirCurrentPassword”是错误的
现在,回到服务器A上,我通过一个不同的API调用再次运行userManager.CheckPasswordAsync
,但这次是传递新密码“theirNewPassword”。我得到一个401(错误的密码)。如果我输入“TheRoldPassword”将会成功,但我已经在服务器B上成功更改了该用户的密码
我唯一能想到的是,服务器A中的MyDbContext
是同一个实例,即使跨不同的HTTP请求,这与文档相反。如果我关闭服务器A,重新启动它,并发出相同的请求,传入“theirNewPassword”,它将按预期进行身份验证。我无法连续关闭和重新启动服务器
我相信我已经发布了我所关心的所有相关代码。如果没有,请告诉我
那么,我如何确保MyDbContext
和标识服务具有作用域,而不是单例生存期呢
此外,我如何手动实例化数据上下文并在控制器操作中显式地设置UserManager
(也称为试图避免DI,它似乎使我的数据上下文和标识服务成为单例).?AddEntityFrameworkStores扩展方法仅添加作用域生命周期注册表。您能否显示插入和使用该userManager
的代码?AddEntityFrameworkStores扩展方法仅添加作用域生命周期注册表您能否显示插入和使用该userManager
的代码?