Ninject UserManager和UserStore

时间:2014-05-31 08:33:52

标签: c# model-view-controller controller ninject

使用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()));

提前谢谢。

2 个答案:

答案 0 :(得分:3)

当然,您只需要确保所有依赖项(ApplicationDbContextUserManager<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; }

希望这能节省一些时间。