.net MVC IdentityDbContext 依赖注入

.net MVC IdentityDbContext Dependency Injection

我正在使用模板化 Asp.Identity 实现创建一个新的 MVC 5 项目。我想做的是在我自己的域实体中利用现有的 Asp.Identify 实现 例如,Asp.Identity 用户可以是 1 个或多个俱乐部的成员。我希望能够访问我的 MVC 控制器中的用户信息 - 例如,我希望能够查看用户是否属于特定角色等。

基本上我对一些我想澄清的问题仍然有点困惑。

在 Startup.Auth.cs 中添加了 ApplicationUserManager 及其关联的 Entity framework DBContext。即

app.CreatePerOwinContext(ApplicationDbContext.Create);
  1. 这个 Entity framework DBContext 会被添加到每个 MVC 控制器吗?这是通过依赖注入完成的吗?

  2. 如果它注入了 IOC - 它是在每个 HTTP 请求上创建的吗?

我通过向其中添加我自己的域实体来扩展现有的模板化 ApplicationDbContext(如下所示)。 3. 我是否能够在 MVC 控制器中访问这些所有内容,并且是按请求访问?

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
  public ApplicationDbContext()
    : base("DefaultConnection", throwIfV1Schema: false)
  {
  }

  public static ApplicationDbContext Create()
  {
    return new ApplicationDbContext();
  }

//Add my own domain entities here...
  public virtual DbSet<Address> Address { get; set; }
  public virtual DbSet<Club> Clubs { get; set; }
}

回答您的问题:

  1. 是的,这是为每个请求创建的。方法名称称为 CreatePerOwinContext(),因此每次创建 OwinContext(针对每个请求)时都会创建此 ApplicationDbContext
  2. 不,这本身不是依赖注入。这是 Owin 上下文创建一个新的上下文,并在请求的生命周期内将其保存在 Owin Bootstrapper 中。这与许多依赖注入容器的工作方式类似,因为它控制对象的生命周期,但这本身不会注入,也不会将上下文注入控制器或其他任何东西。
  3. 是的,您可以使用 Context.GetOwinContext().Get<ApplciationDbContext>() 在控制器中访问这些内容。因为它返回一个 ApplicationDbContext,所以您可以使用 ApplicationDbContext 做任何您能做的事情。因此,如果您扩展它,那么这些扩展属性也将可用。

如果你想用 Owin 对容器进行 DI,你需要一个 Owin 感知的 DependencyResolver。大多数容器都提供一个用于注射。例如,Ninject 提供了 Ninject.Web.Common.OwinHost nuget 包,它允许您使用 app.UseNinjectMiddleware() 配置