为什么不配置UserStore

时间:2015-10-19 23:32:11

标签: c# asp.net-mvc idisposable asp.net-identity-2

默认的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的类的实例?

2 个答案:

答案 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。