asp.net-mvc-3 - update - mvc 4+
Ninject+MVC3=InvalidOperationException: La secuencia no contiene elementos (7)
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 sacar cada mechón de cabello en 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 es causado por el hecho de que hay 2 proyectos con App_Start / NinjectWebCommon.cs
Al eliminar el archivo, se elimina el error.
Nota: si está comprando Nuject.Web.Common porque necesita hacer referencia al conjunto Ninject.Web.Common para uno de los proyectos de su biblioteca de clase, puede eliminar de forma segura la carpeta "App_Start" y "NinjectWebCommon.cs". Está destinado a proyectos de API web / web.
Creé un nuevo proyecto MVC3, pulsé 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, obtengo 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 .Single (), arrojando la excepción.
¿Qué estoy haciendo mal?
He actualizado la Wiki de documentación vinculada en su pregunta para mostrar las dos formas de configurar una aplicación MVC3. Sugiero usar la segunda opción, que es la forma preferida para el PaqueteNuGet.
En lugar de derivar desde 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 se crea el kernel, dónde se cargan los módulos o dónde se definen los enlaces.
Mi solución fue que establecí la propiedad de la carpeta App_Start, Namespace Provider en True.
Lo había cambiado a False para que Resharper no resaltara el espacio de nombres que NO coincidía con la estructura de la carpeta.
Puede observar que después de instalar el ninject.mvc3
NuGet hay una subcarpeta App_Start
creada dentro de su proyecto que contiene un archivo NinjectMVC3.cs
. Elimina esta carpeta y vuelve a intentarlo. Así que aquí están los pasos que seguí:
- Cree un nuevo proyecto ASP.NET MVC 3 usando la plantilla predeterminada
- Abra la ventana de la consola de Package Manager (Ver -> Otras ventanas -> Consola de Package Manager)
- Escriba
install-package ninject.mvc3
en la línea de comando - Reemplace el código predeterminado en
Global.asax
con el código en su pregunta - Elimine la subcarpeta de
AppStart
creada durante la instalación del paquete - Ejecuta la aplicación
- Disfruta de la belleza de la página predeterminada
/Home/Index
abierta en tu navegador web Google Chrome :-)
Quería agregar una causa más ...
Instalamos el paquete Ninject.MVC3 en múltiples proyectos, de los cuales solo uno 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.
Tengo que agregar a esto con la esperanza de que alguien más resuelva el problema más rápidamente y no quiera sacar cada mechón de cabello en su cabeza como casi lo hice.
Necesitaba cambiar el nombre de todo en mi proyecto para que coincida con los nuevos términos comerciales. Cambié espacios de nombres en todas partes e incluso cambié el nombre del ensamblado (proyecto con el botón derecho del ratón> propiedades> pestaña de la aplicación) para que el ensamblaje generado coincida con la nueva convención de nomenclatura. ¡El cambio de nombre del montaje es lo que hizo que Ninject se enojara mucho!
Al cambiar el nombre del ensamblado que se genera, se creó un nuevo archivo con el nuevo nombre cuando lo compilamos. Sin embargo, el archivo antiguo con el nombre anterior todavía estaba en el directorio bin. Si tiene Ninject activando a través de la clase agregada en App_Start, esta clase de activación se invocará en AMBOS conjuntos (uno anterior Y uno nuevo renombrado). No me pregunte cómo o por qué, pero lo hace y le 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 sentados allí.
¡Ve elimina tu carpeta bin antes de intentar hacer cualquier otra cosa! ¡Espero que esto le ahorre a otra persona perder horas de trabajo valiosas!