使用ninject将UserManager和UserStore注入控制器的最优雅方法是什么?例如,可以像这样注入上下文:
kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();
public class EmployeeController : Controller
{
private EmployeeContext _context;
public EmployeeController(EmployeeContext context)
{
_context = context;
}
可以使用一行代码将UserManager和UserStore注入控制器吗?如果没有,最简单的方法是什么? 我不想用这个:
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
提前谢谢。
答案 0 :(得分:3)
当然,您只需要确保所有依赖项(ApplicationDbContext
,UserManager<T>
和UserStore<T>
)都有绑定。绑定开放泛型是这样的:
kernel.Bind(typeof(UserStore<>)).ToSelf().InRequestScope(); // scope as necessary.
如果它有一个接口,你可以像这样绑定它:
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>));
所以,使用这些绑定你应该很高兴:
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
kernel.Bind(typeof(UserManager<>)).ToSelf(); // add scoping as necessary
kernel.Bind(typeof(UserStore<>)).ToSelf(); // add scoping as necessary
答案 1 :(得分:2)
花了8个小时试图弄清楚这一个,我想我已经有了。在其他实现中可能需要修改的一个区别是SharedContext。我的代码有一个继承自DBContext的SharedContext。
kernel.Bind(typeof(DbContext)).To(typeof(SharedContext)).InRequestScope();
kernel.Bind(typeof(IUserStore<ApplicationUser>)).To(typeof(UserStore<ApplicationUser>)).InRequestScope();
kernel.Bind(typeof(UserManager<ApplicationUser>)).ToSelf().InRequestScope();
我还对AccountController进行了更改。
//public AccountController()
// : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new SharedContext())))
//{
//}
public AccountController(UserManager<ApplicationUser> userManager, UserStore<ApplicationUser> userStore)
{
_userStore = userStore;
_userManager = userManager;
}
private UserManager<ApplicationUser> _userManager { get; set; }
private UserStore<ApplicationUser> _userStore { get; set; }
希望这能节省一些时间。