C# Ninject用户管理器和用户存储

C# Ninject用户管理器和用户存储,c#,model-view-controller,controller,ninject,C#,Model View Controller,Controller,Ninject,使用ninject将UserManager和UserStore注入控制器最优雅的方式是什么?例如,可以如下方式注入上下文: kernel.Bind<EmployeeContext>().ToSelf().InRequestScope(); public class EmployeeController : Controller { private EmployeeContext _context; public EmployeeControlle

使用ninject将UserManager和UserStore注入控制器最优雅的方式是什么?例如,可以如下方式注入上下文:

 kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();

    public class EmployeeController : Controller
    {
    private EmployeeContext _context;

    public EmployeeController(EmployeeContext context)
    {
        _context = context;
    }
kernel.Bind(typeof(UserStore<>)).ToSelf().InRequestScope(); // scope as necessary.
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>));
kernel.Bind().ToSelf().InRequestScope();
公共类EmployeeController:控制器
{
私人雇员语境(private EmployeeContext);
公共EmployeeController(EmployeeContext上下文)
{
_上下文=上下文;
}
ninject能用一行代码将UserManager和UserStore注入控制器吗?如果不能,最简单的方法是什么? 我不想用这个:

 var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var-manager=newusermanager(newuserstore(newapplicationdbcontext());

提前感谢您。

当然,您只需要确保所有依赖项(
ApplicationDbContext
UserManager
UserStore
)都有绑定。绑定开放泛型是这样做的:

 kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();

    public class EmployeeController : Controller
    {
    private EmployeeContext _context;

    public EmployeeController(EmployeeContext context)
    {
        _context = context;
    }
kernel.Bind(typeof(UserStore<>)).ToSelf().InRequestScope(); // scope as necessary.
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>));
kernel.Bind(typeof(UserStore)).ToSelf()。
如果它有一个接口,您可以这样绑定它:

 kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();

    public class EmployeeController : Controller
    {
    private EmployeeContext _context;

    public EmployeeController(EmployeeContext context)
    {
        _context = context;
    }
kernel.Bind(typeof(UserStore<>)).ToSelf().InRequestScope(); // scope as necessary.
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>));
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
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind(typeof(UserManager)).ToSelf();//根据需要添加作用域
kernel.Bind(typeof(UserStore)).ToSelf();//根据需要添加作用域

花了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(); 
kernel.Bind(typeof(DbContext)).To(typeof(SharedContext)).InRequestScope();
Bind(typeof(IUserStore)).To(typeof(UserStore)).InRequestScope();
Bind(typeof(UserManager)).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; }
//公共帐户控制器()
//:此(新用户管理器(新用户存储(新SharedContext()))
//{
//}
公共帐户控制器(UserManager UserManager、UserStore UserStore)
{
_userStore=userStore;
_userManager=userManager;
}
私有用户管理器_用户管理器{get;set;}
私有用户存储_用户存储{get;set;}

希望这能为其他人节省一些时间。

@BatteryBackupUnit…谢谢。最后一个问题…我该如何将它们注入控制器?我可以注入上下文,但不确定Usermanager和UserStore为什么您不能以与上下文完全相同的方式进行操作?我非常肯定它会起作用。如果没有,请提供准确的代码/例外操作日志…这是一个新问题:我想替换var manager=new UserManager(new UserStore(new ApplicationDbContext()));我可以替换上下文,但不知道如何替换UserManager,UserStore谢谢,它起了作用。我必须将IUserStore绑定到UserStore才能使它起作用。我认为这项工作做得很好。我将在返回此代码时实现它。