我使用 VS2013 ASP.NET SPA 模板作为我的 Web 应用程序的起点,该应用程序使用新的 ASP.NET 身份框架。这是来自模板:
public partial class Startup
{
static Startup()
{
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
....
}
因此,由于没有 DbContext 被传递到上面的 UserStore 构造函数中,这向我表明正在创建一个新的 DbContext。由于我还想利用数据上下文(用于请求期间的其他数据操作),所以我稍微更改了模板代码:
public partial class Startup
{
public static DerivedDbContext=null;
static Startup()
{
context = new DerivedDbContext();
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(context));
...
}
现在,我可以通过访问从我的任何控制器中使用相同的 DbContext:
Startup.context
但是,当多个请求同时进入时,我遇到了麻烦,因为不相关的操作发生在同一个 DbContext 中。从这里,有人向我指出,我不应该为应用程序的整个生命周期实例化单个 DbContext,而应该只为特定请求的生命周期实例化,所以我将实例化移动到控制器的构造函数,但是现在,我在控制器中有自己的 DbContext,而 UserManager 仍然有自己的(并且在 Startup 类中创建)。
为什么模板为所有用户(在 Startup 类中)实例化一次 UserManager?是否值得担心,通过在控制器构造函数中创建我自己的 DbContext,有两个 DbContext(我在控制器的构造函数中创建的一个,另一个在 UserManager 中,在 Startup 类中创建)同时运行?在所有请求之间共享一个 UserManager 是否可以接受,但在所有请求之间共享一个 DbContext 通常是不可接受的?
使用两个不同的上下文似乎很愚蠢,我注意到我有时会得到一个不同步的数据视图。我想了解是否有其他人在使用此模板时遇到此问题。
**编辑:我知道像 nInject 这样的 IOC 框架可能有助于在这种情况下管理对象生命周期,但我想首先了解如何在没有此类框架帮助的情况下完成此任务。
谢谢...-本