我试图理解vNext
我编写了自定义UserStore,它与MongoDB一起使用并实现了这些接口:
public class UserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>, IUserSecurityStampStore<ApplicationUser>,
IUserLoginStore<ApplicationUser>, IUserClaimStore<ApplicationUser>, IUserEmailStore<ApplicationUser>, IUserRoleStore<ApplicationUser>,
IUserTwoFactorStore<ApplicationUser>
在Startup.cs中添加:
app.UseServices(services =>
{
services.AddIdentity<ApplicationUser>()
.AddUserStore(() => { return new UserStore(); })
.AddUserManager<UserManager<ApplicationUser>>()
.AddHttpSignIn();
services.AddMvc();
});
然后尝试使用Visual Studio模板中未更改的AccountController并遇到麻烦
登录时,我在UserStore.FindByNameAsync()中获取ObjectDisposedException - 称为UserStore.Dispose()。
在github.com/aspnet上的UserManager代码中,Store.Dispose()仅在UserManager.Dispose()中调用。
我可以忽略Dispose的调用,一切正常,但这不是好方法。
所以我不知道该怎么做
P.S。问题是:什么(以及为什么)可以调用UserStore.Dispose()?
答案 0 :(得分:1)
在vNext中,DI内置并管理身份服务的生命周期。在处理服务之后,您可能尝试使用身份,默认情况下,身份服务的生命周期范围限定为请求,因此,例如,如果您尝试挂起对用户管理器的引用并在多个请求中重复使用它,那么会导致ObjectDisposedException。