默认的MVC 5 + Identity 2.1项目包含此行(在Startup.Auth.cs中):
app.CreatePerOwinContext<ApplicationUserManager>ApplicationUserManager.Create);
...定义静态Create
方法(在IdentityConfig.cs中),如下所示:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
...
}
注意如何在那里创建新的UserStore<ApplicationUser>
,并将其传递给ApplicationUserManager
构造函数。另请注意,UserStore<T>
是一次性的(基类实现IDisposable
)。
这让我很奇怪,因为我想知道谁负责处理新创建的UserStore
。我预计ApplicationUserManager
(或它的基类)必须在它本身被处置时处理它。但不是:我查看了源代码,但似乎没有。所以 nobody 处理该实例!
为什么这样?你什么时候不想要处理实现IDisposable
的类的实例?
答案 0 :(得分:2)
我认为没关系,因为UserStore
实际上正在包装实体框架的DbContext
类。虽然DbContext
也是Disposable
,但refer to this blog post处置DbContext
不是强制性的。另外值得指出的是,处理注入的物体并不是一个好主意,事实上,管理对象的生命周期是注射器的责任。因此,显然UserManager
在这种情况下不会处置UserStore
。
答案 1 :(得分:1)
稍晚但我一直在创建一个MVC 5项目,并且可以确认每次http请求完成时都会调用UserStore上的Dispose。
我相信它是在创建ApplicationUserManager时来自IOwinContext引用。特别是用于获取DbContext的上下文:
new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())
在Startup类中,IAppBuilder对象配置为CreatePerOwinContext:
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
如果覆盖UserStore Dispose方法:
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
执行base.Dispose(disposing)后,UserStore的Context属性变为null。