我正试图将我的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
和ApplicationRoleManager
没有HttpContext
,或者我如何在这里访问HttpContext
。
Thanks to lot
实际上,我建议采用一种稍微不同的方法。Identity团队用一个基于OWIN的临时依赖注入容器来引导示例,我认为这是一个大罪。依赖注入是一个好主意,但不是这样的。可以理解的是,不同的开发人员喜欢不同的DI容器,这使得基于真实的DI容器创建示例项目有点不可行,但他们应该在示例项目中避免使用依赖注入,而只是建议使用依赖注入,并可能给出指导,以便在各种容器中实现依赖注入。
话虽如此,HttpContext
在这里的唯一作用是获取OWIN上下文,而这仅仅是用来处理他们对Identity的不成熟的依赖注入。所以,如果你只是用你选择的DI容器注入你自己的UserManager
,你就去掉了对HttpContext
的依赖,你就可以开始了。
您只需要为两件事提供配置:UserManager
和IUserStore
。告诉你的DI容器如何注入这些,然后你就可以在你的库类构造函数中添加对UserManager
的依赖,你就可以开始了。
实际上我可以这样访问它:
public static void InitializeIdentityForEF(IdentityDbContext db)
{
var userManager = new ApplicationUserManager(new ApplicationUserStore(db));
var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(db));
}