ASP标识 - 在参考库上访问HttpContext

时间:2014-08-06 13:44:50

标签: c# asp.net asp.net-mvc asp.net-identity

我正在尝试将我的ASP身份逻辑移到我解决方案中的另一个项目中。

除了我无法访问参考库中的HttpContext之外,一切都很好。我需要使用HttpContext访问ApplicationUserManager来为我的数据库设定种子。

public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
    protected override void Seed(ApplicationDbContext context)
    {
        InitializeIdentityForEF(context);
        base.Seed(context);
    }

    public static void InitializeIdentityForEF(ApplicationDbContext db)
    {            
        var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();

        // Create here users and roles using userManager and roleManager
    }
}

所以问题是:如何在没有ApplicationUserManager的情况下访问ApplicationRoleManagerHttpContext,或者如何在此处访问HttpContext

非常感谢

2 个答案:

答案 0 :(得分:7)

实际上,我建议采用略有不同的方法。身份团队在使用基于OWIN的临时依赖注入容器引导样本时犯下了我认为有点致命的罪。依赖注入是一个好主意,但不是这样的。可以理解的是,不同的开发人员更喜欢不同的DI容器,这使得基于真正的DI容器创建一个示例项目有点不可取,但他们应该避免在示例项目中使用依赖注入,并且只是建议使用依赖注入和也许给出了用各种容器实现这一点的指导。

所有这一切,这里唯一使用的是HttpContext是获取OWIN上下文,而且仅使用它来处理它们对Identity的半生不得的依赖注入。因此,如果您只是将自己的UserManager注入您选择的DI容器,则会删除对HttpContext的依赖,并且您可以继续使用。

您只需提供两件事的配置:UserManagerIUserStore。告诉您的DI容器如何注入它们,然后您可以在库类构造函数中添加对UserManager的依赖,然后您就可以开始滚动了。

答案 1 :(得分:3)

实际上,我可以通过以下方式访问它:

public static void InitializeIdentityForEF(IdentityDbContext db)
{
    var userManager = new ApplicationUserManager(new ApplicationUserStore(db));
    var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(db));
}