2015-10-19 34 views
3

默认MVC 5 +身份2.1项目包含这条线(在Startup.Auth.cs):为什么OK不要丢弃一个UserStore

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(或它的基类)必须在处置它时处置它。但是,不:我看着源头,似乎不是。所以没有人处置该实例!

这是为什么?你什么时候不是想要处理一个实现IDisposable的类的实例?

回答

2

我认为这是好的,因为UserStore实际上是包装实体框架的DbContext类。而DbContext也是Disposable,但refer to this blog post处置DbContext不是强制性的。另外值得指出的是,处理注入对象并不是一个好主意,事实上注入器负责管理对象的生命周期。因此,在这种情况下,明显UserManager剂量不配置UserStore

+0

你看过那篇文章的评论吗?他们概述了在上下文中调用Dispose的一些非常好的理由,即使它不是绝对必要的。 –

+0

我并不认为ApplicationUserManager应该负责处理上下文 - 这不是我想看到的行为。但是,框架中有类似这样的类。 –

+0

当然放置一次性物体是一个好主意。我试图说,在这种情况下,处理'DbContext'不是必需的,你可以忽略它。就像他们在这个例子中所做的一样。顺便说一下,如果你真的想把'UserStore'简单地放在'Owin'上下文中并在Create方法中检索它。 Owin的上下文管理器会处理它。 –

1

稍晚,但我一直在创建一个MVC 5项目,并且可以确认每当http请求完成时都会调用UserStore上的Dispose。

我相信它在创建ApplicationUserManager时来自IOwinContext引用。具体地被使用的上下文来获得的DbContext:

new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()) 

在启动类的IAppBuilder对象被配置为CreatePerOwinContext:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

如果覆盖UserStore Dispose方法:

protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

执行base.Dispose(disposing)后,UserStore的Context属性将变为null。