C# 为什么不处理UserStore可以

C# 为什么不处理UserStore可以,c#,asp.net-mvc,idisposable,asp.net-identity-2,C#,Asp.net Mvc,Idisposable,Asp.net Identity 2,默认的MVC5+Identity 2.1项目包含以下行(在Startup.Auth.cs中): 注意如何在那里创建新的UserStore,并将其传递给ApplicationUserManager构造函数。还要注意,UserStore是一次性的(基类实现了IDisposable) 这让我感到奇怪,因为我想知道是谁负责处理新创建的UserStore。我希望ApplicationUserManager(或它的基类)在释放它时必须释放它。但是没有:我看了来源,似乎没有。所以没有人会处理那个实例 为什么可

默认的MVC5+Identity 2.1项目包含以下行(在Startup.Auth.cs中):

注意如何在那里创建新的
UserStore
,并将其传递给
ApplicationUserManager
构造函数。还要注意,
UserStore
是一次性的(基类实现了
IDisposable

这让我感到奇怪,因为我想知道是谁负责处理新创建的
UserStore
。我希望
ApplicationUserManager
(或它的基类)在释放它时必须释放它。但是没有:我看了来源,似乎没有。所以没有人会处理那个实例


为什么可以?什么时候您不想处理实现了
IDisposable
的类的实例?

我认为这是可以的,因为
UserStore
实际上正在包装实体框架的
DbContext
类。虽然
DbContext
也是
一次性的
,但处置
DbContext
不是强制性的。另外值得指出的是,处理注入对象并不是一个好主意,事实上,管理对象的生命周期是注入器的责任。因此,在这种情况下,
UserManager
显然不会处理
UserStore

有点晚,但我已经创建了一个MVC 5项目,可以确认每次http请求完成时都会调用UserStore上的dispose

我相信它来自创建ApplicationUserManager时的IOwinContext引用。特别是用于获取DbContext的上下文:

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

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

您读过该帖子上的评论了吗?他们概述了在上下文上调用Dispose的一些非常好的理由,尽管这不是严格必要的。我决不是建议
ApplicationUserManager
应该负责处理上下文-这不是我希望看到的行为。然而,框架中有些类的行为是这样的。当然,处理一次性对象是个好主意。我试图说,在本例中,不需要处理
DbContext
,您可以忽略它。就像他们在这个例子中所做的那样。顺便说一句,如果您真的想处理
UserStore
,只需将它放在
Owin
上下文中,然后在Create方法中检索它<代码>Owin上下文管理器将处理它。
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
     ...
}
new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }