2015-10-19 38 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。