c# - ninjectwebcommon - Ninject UserManager y UserStore
ninject mvc example (2)
¿Cuál es la forma más elegante de inyectar UserManager y UserStore en un controlador usando ninject? Por ejemplo, el contexto puede ser inyectado así:
kernel.Bind<EmployeeContext>().ToSelf().InRequestScope();
public class EmployeeController : Controller
{
private EmployeeContext _context;
public EmployeeController(EmployeeContext context)
{
_context = context;
}
¿Puede ninject inyectar UserManager y UserStore con una línea de código en un controlador? Si no, ¿cuál es la forma más fácil? No quiero usar esto:
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
Gracias de antemano.
Por supuesto, solo necesita asegurarse de que haya enlaces para todas las dependencias ( ApplicationDbContext
, UserManager<T>
y UserStore<T>
). Los genéricos abiertos vinculantes se hacen así:
kernel.Bind(typeof(UserStore<>)).ToSelf().InRequestScope(); // scope as necessary.
si tuviera una interfaz, la vincularías así:
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>));
Por lo tanto, con estas fijaciones deberías estar listo:
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
kernel.Bind(typeof(UserManager<>)).ToSelf(); // add scoping as necessary
kernel.Bind(typeof(UserStore<>)).ToSelf(); // add scoping as necessary
Pasé 8 horas tratando de resolver esto, y creo que lo tengo. La única diferencia que podría necesitar modificarse en otras implementaciones es SharedContext. Mi código tiene SharedContext que hereda de DBContext.
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();
También hice cambios en 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; }
Espero que esto le ahorre a alguien más algo de tiempo.