Pregunta

Acabo de actualizar el proyecto MVC2 a MVC3 y utiliza la biblioteca de referencia paquete NuGet instalar ninject. Esto creó una clase AppStart y he utilizado el siguiente código para inyectar mi clase IMembershipService.

public static void RegisterServices(IKernel kernel) {
        kernel.Bind<IMembershipService>().To<AccountMembershipService>();
    }

Esto funciona muy bien con mi HomeController, por ejemplo.

public class HomeController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public HomeController() : this(null) { }

    public HomeController(IMembershipService service)
    {
        MembershipService = service;
    }

Sin embargo, estoy usando un BaseController. Casi el mismo código en la clase base ya no funciona.

public class BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }
    public UserService UserService { get; set; }

    public BaseController() : this(null, null) { }

    public BaseController(IMembershipService service, UserService userService)
    {
        MembershipService = service;
        UserService = userService ?? new UserService();
    }

Si rompo en el constructor del controlador base, el servicio es simplemente NULL. Nunca he utilizado para Ninject COI así que tal vez la respuesta es obvia, pero ¿por qué no inyecte mi AccountMembershipController en la clase base como yo quiero? No veo lo que es diferente, aunque me di cuenta del nivel adicional de la herencia puede jugar con Ninject de alguna manera.

¿Fue útil?

Solución

me encontré con este mismo problema mismo. Asumiendo su apariencia código como el siguiente:

public HomeController : BaseController
{

}

public BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public MembershipService() { }

    public MembershipService(IMembershipService service)
    {
        MembershipService = service;
    }
}

Por alguna razón, Ninject HomeController piensa que sólo tiene un constructor, el uno sin parámetros por defecto. Cuando se pone todo en HomeController, se puede encontrar el constructor inyectable, pero el factor hacia fuera en una clase base y por alguna razón no se verá en la clase base para ver si hay algún constructores sobrecargados. Hay dos soluciones para esto:

  1. Eliminar el constructor por defecto. Esta es mi solución preferida, ya que obliga al constructor a inyectar (como cuando se crea el controlador de forma manual cuando la unidad de pruebas), pero el inconveniente es que hay que poner en práctica el constructor en todas sus subclases.
  2. Mantener el constructor por defecto, pero añadir el [Inject] atributo a todas sus propiedades inyectables:

    public BaseController : Controller
    {
        [Inject] public IMembershipService MembershipService { get;set; }
        // rest is the same
    }
    

Ninject inyectará correctamente las propiedades de esta manera, pero tenga en cuenta que Ninject llamará al constructor sin parámetros.

Otros consejos

Sus HomeController dervices de controlador, no BaseController? Además, usted tiene un constructor por defecto para BaseController que restablece como nulo. ¿Por qué tiene eso en absoluto? Me gustaría empezar por deshacerse de los constructores por defecto. Que no es necesario ningún constructor por defecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top