not ninjectwebcommon mvc example added c# model-view-controller controller ninject

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.