Ninject + MVC3 = InvalidOperationException: La secuencia no contiene elementos

90

Creé un nuevo proyecto MVC3, presioné F5, vi la página de muestra.

Luego usé NuGet para obtener la extensión Ninject.MVC . Modifiqué mi global.asax de acuerdo con la documentación de Ninject, Cómo configurar una aplicación MVC3 :

public class MvcApplication : NinjectHttpApplication
{
   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
   {
       filters.Add(new HandleErrorAttribute());
   }

   public static void RegisterRoutes(RouteCollection routes)
   {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", 
               id = UrlParameter.Optional });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}

Ahora, cuando ejecuto la aplicación, aparece la pantalla amarilla de la muerte con la siguiente excepción:

InvalidOperationException: la secuencia no contiene elementos.

en System.Linq.Enumerable.Single (...)

en Ninject.Web.Mvc.Bootstrapper.Initialize (...) línea 67.

Y efectivamente , la línea 67 de ese archivo llama a .Single (), lanzando así la excepción.

¿Qué estoy haciendo mal?

Judá Gabriel Himango
fuente

Respuestas:

101

Puede notar que después de instalar ninject.mvc3NuGet hay una App_Startsubcarpeta creada dentro de su proyecto que contiene un NinjectMVC3.csarchivo. Elimina esta carpeta y vuelve a intentarlo. Así que aquí están los pasos que seguí:

  1. Cree un nuevo proyecto ASP.NET MVC 3 usando la plantilla predeterminada
  2. Abra la ventana de la Consola del Administrador de paquetes (Ver -> Otras ventanas -> Consola del Administrador de paquetes)
  3. Escriba install-package ninject.mvc3en la línea de comando
  4. Reemplace el código predeterminado Global.asaxcon el código en su pregunta
  5. Elimina la AppStartsubcarpeta creada durante la instalación del paquete.
  6. Ejecutar la aplicación
  7. Disfrute de la belleza de la /Home/Indexpágina predeterminada abierta en su navegador web Google Chrome :-)
Darin Dimitrov
fuente
3
Eso funciono. No sé por qué. No me gusta corregir errores sin entenderlo ... pero gracias, esto me desbloquea.
Judah Gabriel Himango
19
No es un error. El paquete NuGet solo usa otra forma de configurar el kernel para que no tenga que cambiar el archivo global.asax. Su aplicación se utilizó en ambos sentidos simultáneamente, lo que puso la extensión en un estado no válido ya que se inició dos veces.
Remo Gloor
Gracias por la útil explicación, Remo.
Judah Gabriel Himango
4
¿Cuál es la forma correcta de resolver esto sin eliminar la carpeta App_Start?
Ryan Lundy
12
@Kyralessa, dejando Global.asax como está (sin derivar de NinjectHttpApplication) y configurando el kernel en el ~/App_Start/NinjectMVC3.csarchivo ( RegisterServicesmétodo).
Darin Dimitrov
120

Tengo que agregar a esto con la esperanza de que alguien más resuelva el problema más rápidamente y no quiera arrancar cada mechón de cabello de su cabeza como casi lo hice.

Necesitaba cambiar el nombre de todo en mi proyecto para que coincidiera con los nuevos términos comerciales. Cambié los espacios de nombres en todas partes e incluso cambié el nombre del ensamblaje (haga clic con el botón derecho en el proyecto> propiedades> pestaña de la aplicación) para que el ensamblaje generado coincida con la nueva convención de nomenclatura. ¡El cambio de nombre de la asamblea es lo que enfureció mucho a Ninject!

Al cambiar el nombre del ensamblado que se genera, se estaba creando un nuevo archivo con el nuevo nombre cuando compilamos. Sin embargo, el archivo antiguo con el nombre antiguo todavía estaba en el directorio bin. Si tiene Ninject activándose a través de la clase agregada en App_Start, esta clase de activación se invocará en AMBOS ensamblados (el antiguo Y el nuevo renombrado). No me preguntes cómo ni por qué, pero lo hace y te da este error "ya inicializado".

Ni siquiera la solución de limpieza funciona porque Visual Studio solo eliminará los binarios que está generando, que serían los nuevos renombrados. Deja a los viejos solos allí sentados.

¡Ve a eliminar tu carpeta bin antes de intentar hacer cualquier otra cosa! ¡Espero que esto evite que otra persona pierda valiosas horas de trabajo!

Chev
fuente
7
Bueno, perdí como 40 minutos antes de encontrar su respuesta. ¡Gracias Alex!
Maxim V. Pavlov
3
La respuesta aceptada no lo hizo por mí, pero esta sí lo hizo. Gracias Alex.
Pluc
2
Muchas gracias! Me quemé una hora en este tema y hubiera quemado muchas más sin tu respuesta. Esta debería ser la respuesta correcta a la pregunta apropiada.
Doug
2
¡Brillante! Gracias Alex. Perdí tanto tiempo tratando de llegar al fondo de esto, su solución funcionó perfectamente.
Apogeo
3
Esto fue fantástico. Muchas gracias. Hice exactamente esto, un cambio de nombre completo del espacio de nombres y ni siquiera atribuí mis problemas al hecho de que el ensamblaje todavía estaba construido en el contenedor. ¡Muchas gracias!
David L
23

He actualizado la documentación Wiki vinculada en su pregunta para mostrar ambas formas de configurar una aplicación MVC3. Sugiero usar la segunda opción, que es la forma preferida para el paquete NuGet.

En lugar de derivar de NinjectHttpApplication, está utilizando NinjectMVC.cs en la carpeta AppStart que se crea durante la instalación del paquete. Esta es también la ubicación donde crea el kernel y donde carga sus módulos o donde define los enlaces.

Remo Gloor
fuente
Muy útil, Remo. Como ya marqué una respuesta, simplemente votaré a favor de la tuya y tal vez a favor de algunas otras de las tuyas. Gracias por hacer todo lo posible para responder y actualizar el Wiki.
Judah Gabriel Himango
4

Como dijo Alex Ford:

Tengo que agregar a esto con la esperanza de que alguien más resuelva el problema más rápidamente y no quiera arrancar cada mechón de cabello de su cabeza como casi lo hice.

Tenía una versión especial de ese problema que podría resolverse de la siguiente manera:

Detalles de la excepción: System.InvalidOperationException: La secuencia no contiene elementos

Este error se debe al hecho de que hay 2 proyectos con App_Start / NinjectWebCommon.cs

Eliminar el archivo elimina el error.

Nota: si está obteniendo Ninject.Web.Common porque necesita hacer referencia al ensamblado Ninject.Web.Common para uno de sus proyectos de biblioteca de clases, puede eliminar de forma segura la carpeta "App_Start" y "NinjectWebCommon.cs". Está destinado a proyectos web / api web.

> haga clic aquí para ver la entrada original del blog <

Wowe
fuente
Después de cambiar el espacio de nombres de mis proyectos, hoy me encontré nuevamente con el mismo problema. Todas las soluciones aquí no ayudaron. La limpieza y la reconstrucción no ayudaron. Pero lo que ayudó fue eliminar las carpetas bin y obj de mi proyecto. Parece que todavía hay algunas piezas de la parte anterior del espacio de nombres que no se eliminaron con una limpieza.
Wowe
Hola Da_Wolf, eso es todo. Gracias.
Resolviste
2

Mi solución fue que había configurado la propiedad de la carpeta App_Start, Proveedor de espacio de nombres en True.

Había cambiado esto a Falso para que Resharper no resaltara el espacio de nombres que NO coincide con la estructura de la carpeta.

PhilAI
fuente
Esto fue todo para mí, volviéndome loco.
rashleighp
2

Quería agregar una causa más ...

Instalamos el paquete Ninject.MVC3 en varios proyectos, solo uno de los cuales era una aplicación MVC real. Sin embargo, olvidamos eliminar la carpeta App_Start.

La eliminación de la carpeta App_Start del proyecto al que se hace referencia resolvió el problema.

fordareh
fuente
¡Si! ¡Esto fue! ¡Había agregado por error un segundo archivo Ninjectwebcommon.cs en otro proyecto! Esto fue todo (Usando MVC 5)
Jose A
1

Para agregar a la respuesta de @ Chev ... este también fue mi problema final. Si está implementando en un sitio web de Azure (ahora llamado AppSite), desea hacer clic en este cuadro en la publicación para eliminar archivos antiguos.

publicar en captura de pantalla azul

viggity
fuente
¡Esta es exactamente la misma imagen que estaba a punto de publicar! Ojalá me hubiera desplazado hasta esta respuesta, pero las respuestas anteriores me llevan a esta idea. +1
Jess