问题很简单,我正在尝试在我的应用程序中实现角色,而且如果不是我去的所有地方,请告诉我在startup.auth中使用以下行:
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
问题是,Visual studio一直告诉我ApplicationRoleManager不存在!我已经搜索了不同的方法来实现这个,但是每个人都在说“使用ApplicationRoleManager”,但我不能使用它,显然,我已经得到了它所需的库。
这里非常欢迎任何帮助。
显然,我的应用程序没有自动生成ApplicationRoleManager代码,所以我试图手动添加它。在IdentityConfig.Cs中,我添加了以下代码:
public class ApplicationRoleManager : RoleManager<IdentityRole>
{
public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
: base(roleStore)
{
}
}
此时我卡住了,因为显然我需要其他方法(比如create方法)来完成这项工作,但我找不到任何要添加的代码示例。
编辑我目前正在尝试实施工厂来实施角色管理。但是我遇到了VS没有检测到某些物体的问题,这里有一张图片可以更好地展示它:
我已经在nuget中更新了我的身份包,我仍然遇到了库的问题。
答案 0 :(得分:1)
您正在创建工厂以创建角色管理器。因此,create方法是您应该实现的唯一方法。但说实话,如果你不想要,你也不需要。所以有两种方法可以做到这一点:
app.CreatePerOwinContext<RoleManager<IdentityRole>>(new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(new SomeContext()));
或者您可以创建一个工厂来为您完成:
public class RoleManagerFactory
{
private readonly IDbContextFactory<SomeContext> contextFactory
public RoleManagerFactory(IDbContextFactory<SomeContext> contextFactory)
{
this.contextFactory = contextFactory;
}
public RoleManager<IdentityRole> Create()
{
return new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(contextFactory.Create()));
}
// If you have already instantiated a context to use, then you can pass it in here
public RoleManager<IdentityRole> Create(SomeContext context)
{
return new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(context));
}
}
var factory = new RoleManagerFactory();
app.CreatePerOwinContext<RoleManager<IdentityRole>>(factory.Create());
我相信这些方法比你想做的更容易。
<强> 修改 强>
我添加了上下文工厂,因为我记得你需要将一个上下文传递给角色存储。所以EntityFramework已经作为IDbContextFactory<TContext>
接口,所以你只需要创建一个具体的实现并实现接口,这是另一个Create
方法,你返回一个新的上下文:new SomeContext()
。
这就是我在我的应用中所做的。实际上,我使用依赖注入并根据请求创建角色管理器。我使用这个工厂,以便我可以将角色管理器注入我的类:
public interface IRoleManagerFactory
{
RoleManager<IdentityRole> Create();
}
所以在我的课程中我可以这样做:
public class RoleController : Controller
{
private readonly IRoleManagerFactory roleManagerFactory;
public RoleController (IRoleManagerFactory roleManagerFactory)
{
this.roleManagerFactory = roleManagerFactory;
}
// Create method
public async Task<JsonResult> CreateRole(string role)
{
using (var roleManager = this.roleManagerFactory.Create())
{
var result = await roleManager.CreateAsync(role);
return Json(new { succeeded: result.Succeeded });
}
}
}
<强> 修改 强>
我已正确使用角色管理器和数据库上下文更新了示例。