C# 无法访问UserManager上的已释放对象。使用.NET Core 3.1的用户
我正在使用ninject到DI,当我想注入我自己的AppUser的UserManager时,我有一个控制器:C# 无法访问UserManager上的已释放对象。使用.NET Core 3.1的用户,c#,asp.net-core,asp.net-core-mvc,ninject,ninject.web.mvc,C#,Asp.net Core,Asp.net Core Mvc,Ninject,Ninject.web.mvc,我正在使用ninject到DI,当我想注入我自己的AppUser的UserManager时,我有一个控制器: public class AdminController: Controller { private UserManager<AppUser> userManager; public AdminController(UserManager<AppUser> usrMgr) { userManager = usrMgr;
public class AdminController: Controller
{
private UserManager<AppUser> userManager;
public AdminController(UserManager<AppUser> usrMgr)
{
userManager = usrMgr;
}
public ViewResult Index() => View(userManager.Users);
}
公共类AdminController:控制器
{
私有用户管理器用户管理器;
公共管理员控制器(UserManager usrMgr)
{
userManager=usrMgr;
}
public ViewResult Index()=>View(userManager.Users);
}
在ConfigureServices方法中,我添加了
services.AddDbContext<AppIdentityDbContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:SportsStoreIdentity"]));
services.AddIdentity<AppUser, IdentityRole>().AddEntityFrameworkStores<AppIdentityDbContext>().AddDefaultTokenProviders();
services.AddDbContext(options=>options.UseSqlServer(配置[“ConnectionString:SportsStoreIdentity]”);
services.AddIdentity().AddEntityFrameworkStores().AddDefaultTokenProviders();
然后我声明配置如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AppIdentityDbContext context, UserManager<AppUser> usrMgr)
{
app.UseAuthentication();
NinjectWebCommon.ConnectionString = Configuration["ConnectionStrings:DefaultConnection"];
kernel = NinjectWebCommon.Kernel;
kernel.Bind<UserManager<AppUser>>().ToConstant(usrMgr).InSingletonScope();
kernel.Bind<AppIdentityDbContext>().ToConstant(context).InSingletonScope();
//Other code...
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、ILoggerFactory loggerFactory、AppIdentityDbContext上下文、UserManager usrMgr)
{
app.UseAuthentication();
NinjectWebCommon.ConnectionString=配置[“ConnectionString:DefaultConnection”];
kernel=NinjectWebCommon.kernel;
kernel.Bind().ToConstant(usrMgr.InSingletonScope();
kernel.Bind().ToConstant(context.InSingletonScope();
//其他代码。。。
}
将userManager注入我的管理控制器是错误的,但当我尝试调用索引时,userManager上出现错误。用户:
System.ObjectDisposedException:'无法访问已处置的对象。A.
此错误的常见原因是处理已解决的上下文
从依赖项注入,然后稍后尝试使用相同的
应用程序中其他位置的上下文实例。如果您
正在对上下文调用Dispose(),或将上下文包装到
使用语句。如果您使用的是依赖项注入,那么应该让
依赖项注入容器负责处理上下文
实例
如何防止处置UserManager?我处理不同的范围,但不起作用。
当我运行这样的方法时,错误严格集中在userManager上
public async Task<IActionResult> Index()
{
var user = new AppUser { UserName = "test@gmail.com", Email = "test@gmail.com" };
var d = await userManager.CreateAsync(user, "1234567");
if (d == IdentityResult.Success)
{
return Ok();
}
else
{
return BadRequest(d);
}
}
公共异步任务索引()
{
var user=new AppUser{UserName=”test@gmail.com“,电子邮件=”test@gmail.com" };
var d=await userManager.CreateAsync(用户,“1234567”);
if(d==IdentityResult.Success)
{
返回Ok();
}
其他的
{
返回请求(d);
}
}
这里可能发生的情况是,您正在将一个IEnumerable
传递给您的视图(Users
属性),因此在处理登录管理器后,查询将在视图中缓慢地进行评估。如果是这种情况,您应该作为控制器操作方法的一部分执行查询,并将视图模型返回到视图。否则,您将在视图中有效地运行控制器逻辑,这将导致各种问题,如此。是的,我在视图上有IEnumerable,我更改了它,但它仍然不起作用。此外,我还添加了一些代码和索引类的其他实现。它也不起作用。