Ninject + MVC3 = InvalidOperationException: a sequência não contém elementos

90

Criei um novo projeto MVC3, apertei F5, vi a página de amostra.

Em seguida, usei o NuGet para obter a extensão Ninject.MVC . Modifiquei meu global.asax de acordo com a documentação do Ninject, Como configurar um aplicativo 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);
   }
}

Agora, quando executo o aplicativo, obtenho a tela amarela da morte com a seguinte exceção:

InvalidOperationException - a sequência não contém elementos.

em System.Linq.Enumerable.Single (...)

na linha Ninject.Web.Mvc.Bootstrapper.Initialize (...) 67.

E com certeza, a linha 67 desse arquivo chama .Single (), lançando assim a exceção.

O que estou fazendo de errado?

Judah Gabriel Himango
fonte

Respostas:

101

Você pode notar que, após instalar o ninject.mvc3NuGet, há uma App_Startsubpasta criada dentro do seu projeto contendo um NinjectMVC3.csarquivo. Exclua esta pasta e tente novamente. Então, aqui estão as etapas que segui:

  1. Crie um novo projeto ASP.NET MVC 3 usando o modelo padrão
  2. Abra a janela do Console do gerenciador de pacotes (Exibir -> Outras janelas -> Console do gerenciador de pacotes)
  3. Digite install-package ninject.mvc3na linha de comando
  4. Substitua o código padrão Global.asaxpelo código em sua pergunta
  5. Exclua a AppStartsubpasta criada durante a instalação do pacote
  6. Execute o aplicativo
  7. Aproveite a beleza da /Home/Indexpágina padrão aberta em seu navegador Google Chrome :-)
Darin Dimitrov
fonte
3
Isso funcionou. Não sei por quê. Não gosto de consertar bugs sem entender ... mas obrigado, isso me desbloqueia.
Judah Gabriel Himango
19
Não é um inseto. O pacote NuGet usa apenas outra maneira de configurar o kernel para que não seja necessário alterar o global.asax. Seu aplicativo usou as duas maneiras simultaneamente, o que colocou a extensão em um estado inválido ao ser iniciada duas vezes.
Remo Gloor
Obrigado pela explicação útil, Remo.
Judah Gabriel Himango
4
Qual é a maneira correta de resolver isso sem excluir a pasta App_Start?
Ryan Lundy
12
@Kyralessa, deixando Global.asax como está (não derivando de NinjectHttpApplication) e configurando o kernel no ~/App_Start/NinjectMVC3.csarquivo ( RegisterServicesmétodo).
Darin Dimitrov
120

Eu tenho que adicionar a isso na esperança de que outra pessoa resolva o problema mais rapidamente e não queira arrancar cada fio de cabelo da cabeça como eu quase fiz.

Eu precisava renomear tudo em meu projeto para corresponder aos novos termos de negócios. Mudei os namespaces em todos os lugares e até mudei o nome do assembly (clique com o botão direito do mouse em projeto> propriedades> guia do aplicativo) para que o assembly gerado corresponda à nova convenção de nomenclatura. A mudança de nome da assembléia é o que deixou Ninject muito irritado!

Ao renomear o assembly gerado, um novo arquivo com o novo nome estava sendo criado quando compilamos. No entanto, o arquivo antigo com o nome antigo ainda estava no diretório bin! Se você tiver Ninject ativando por meio da classe adicionada em App_Start, então essa classe de ativação será chamada em AMBOS os assemblies (o antigo E o novo renomeado). Não me pergunte como ou por quê, mas ele pergunta e mostra o erro "já inicializado".

Nem mesmo a solução de limpeza funciona porque o Visual Studio apenas removerá os binários que está gerando, que seriam os novos renomeados. Isso deixa os mais velhos sozinhos, sentados ali.

Exclua sua pasta bin antes de tentar fazer qualquer outra coisa! Espero que isso evite que alguém desperdice valiosas horas de trabalho!

Chev
fonte
7
Bem, eu perdi cerca de 40 minutos antes de tropeçar na sua resposta. Obrigado Alex!
Maxim V. Pavlov
3
A resposta aceita não me ajudou, mas esta sim. Obrigado Alex.
Pluc
2
Muito obrigado! Gastei uma hora neste assunto e teria queimado muito mais sem sua resposta. Esta deve ser a resposta correta para a pergunta apropriada.
Doug
2
Brilhante! Obrigado Alex. Perdi muito tempo tentando chegar ao fundo disso, sua solução funcionou perfeitamente.
Apogee
3
Isso era fantástico. Muito obrigado. Fiz exatamente isso, uma renomeação completa do namespace e nem mesmo atribuí meus problemas ao fato de que o assembly ainda estava compilado no bin. Muito obrigado!
David L de
23

Eu atualizei a documentação Wiki vinculada em sua pergunta para mostrar as duas maneiras de configurar um aplicativo MVC3. Eu sugiro usar a segunda opção que é a forma preferida para o pacote NuGet.

Em vez de derivar de NinjectHttpApplication, ele está usando o NinjectMVC.cs na pasta AppStart, que é criada durante a instalação do pacote. Este também é o local onde você cria o kernel e onde carrega seus módulos ou onde define as ligações.

Remo Gloor
fonte
Muito útil, Remo. Como já marquei uma resposta, irei votar a favor da sua e talvez de algumas outras suas. Obrigado por ir além ao responder e atualizar o Wiki.
Judah Gabriel Himango
4

Como disse Alex Ford:

Eu tenho que adicionar a isso na esperança de que outra pessoa resolva o problema mais rapidamente e não queira arrancar cada fio de cabelo da cabeça como eu quase fiz.

Eu tinha uma versão especial desse problema que poderia ser resolvido da seguinte maneira:

Detalhes da exceção: System.InvalidOperationException: a sequência não contém elementos

Este erro é causado pelo fato de haver 2 projetos com App_Start / NinjectWebCommon.cs

Remover o arquivo elimina o erro.

Nota: se você estiver obtendo Ninject.Web.Common porque precisa fazer referência ao assembly Ninject.Web.Common para um de seus projetos de biblioteca de classe, você pode remover com segurança a pasta “App_Start” e “NinjectWebCommon.cs”. Destina-se a projetos de API web / web.

> clique aqui para ver a entrada original do blog <

Uau
fonte
Depois de alterar o namespace de meus projetos, corri hoje novamente para o mesmo problema. Todas as soluções aqui não ajudaram. Limpeza e reconstrução não ajudaram. Mas o que ajudou foi excluir as pastas bin e obj do meu projeto. Parece que ainda existem algumas partes da parte do antigo namespace que não foram excluídas com a limpeza.
Wowe
Oi Da_Wolf, é isso. Obrigado. Você resolveu meu problema
VivekDev
2

Minha solução foi definir a propriedade da pasta App_Start, Provedor de namespace como True.

Eu mudei isso para False para que o Resharper não realce o namespace que NÃO corresponde à estrutura da pasta.

PhilAI
fonte
Isso era tudo para mim, me deixando louco.
rashleighp 01 de
2

Queria adicionar mais uma causa ...

Instalamos o pacote Ninject.MVC3 em vários projetos - apenas um dos quais era um aplicativo MVC real. No entanto, esquecemos de remover a pasta App_Start.

Remover a pasta App_Start do projeto referenciado resolveu o problema.

Fordareh
fonte
sim! Era isso! Eu tinha adicionado por engano um segundo arquivo Ninjectwebcommon.cs em outro objeto! Era isso (usando MVC 5)
Jose A
1

Para dar continuidade à resposta de @Chev ... esse foi meu problema final também. Se você estiver implantando em um site do Azure (agora denominado AppSite), você deseja clicar nesta caixa na publicação para remover arquivos antigos

publicar na captura de tela do azure

viggidade
fonte
Esta é exatamente a mesma foto que eu estava prestes a postar! Eu gostaria de ter rolado para baixo até esta resposta, mas as respostas acima me levam a essa ideia. +1
Jess