7
respostas

Injetar o DAO no controller

Ola, estou tentando injetar o DAO no controller, sem sucesso. Como o construtor passa a precisar dos parametros, esta dando o erro:

Nenhum construtor sem parâmetros foi definido para este objeto. No DAO o construtor pede um context

 private MovimentacaoDAO movimentacaoDAO;
        private UsuarioDAO usuarioDAO;

        public MovimentacaoController(MovimentacaoDAO movimentacaoDAO, UsuarioDAO usuarioDAO)
        {
            this.movimentacaoDAO = movimentacaoDAO;
            this.usuarioDAO = usuarioDAO;
        }
7 respostas

Olá Oscar,

você chegou a instalar algum framework de injeção de dependências, como o NInject ou o Unity? Porque somente o asp.net mvc puro não conseguirá injetar o context no dao e depois o dao no Controller.

Sim Lucas, instalei o NInject via nuget, e configurei no NinjectWebCommon meu contexto no RegisterServices.

No DAO tento fazer a injecao do context

private DBContext context;

        public BorderDAO(DBContext context)
        {
            this.context = context;
        }

Esquisito, me manda o RegisterServices do NinjectWebCommon para eu dar uma olhada.

Obrigado Lucas,segue:

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<DBContext>().ToSelf().InRequestScope();
        }

No caso esta DBContext é a classe de contexto que você criou que herda de DbContext né? Não é a classe DbContext que vem no Entity?

Outra coisa que você pode dar uma olhada é se no seu Web.config, na tag <runtime> aparece uma <assemblyIdentity name="System.Web.Mvc" ... >. Se você tiver até isso no seu projeto, uma possibilidade estranha é fechar e abrir o Visual Studio, dando o Clean e depois um Rebuild no projeto. Por mais bizarro que pareça, as vezes o Visual Studio se perde nas referências dos arquivos e pode ser que ele esteja rodando sem o NInject.

Se nem fechando e abrindo o Visual Studio não rolar, você pode me mandar este projeto para eu testar na minha máquina? Poderia colocar num Github que eu pego e testo aqui.

Cara nao conheço muito do Ninject, mas uma observação, não deveria ter registrado os DAOs para o Ninject também fazer a injeção das dependencias?

Se fosse o framework de injeção usado no .net core ai sim seria necessário declarar os DAOs também. Mas no .net framework usando especificamente o NInject em teoria não precisaria, dado que o NInject já consegue fazer as injeções sem você precisar declarar no NinjectWebCommon. A necessidade de se declarar o DBContext é por conta que você pode receber diferentes DAOs no controller, sendo que cada DAO terá que receber o DBContext

//Controller
public MovimentacaoController(MovimentacaoDAO movimentacaoDAO, UsuarioDAO usuarioDAO)
{
            this.movimentacaoDAO = movimentacaoDAO;
            this.usuarioDAO = usuarioDAO;
}

Por default, se você não declarar nada no NinjectWebCommon, para cada DAO o NInject criaria um contexto específico. Ou seja, 2 contextos são abertos para se trabalhar com este Controller. Só que no caso poderia se usar apenas 1 comum para ambos os DAOs. Para fazer isso, temos que definir que ao instanciar o DBContext ele será InRequestScope, ou seja, apenas 1 contexto criado para cada requisição:

private static void RegisterServices(IKernel kernel)
{
            kernel.Bind<DBContext>().ToSelf().InRequestScope(); //para cada requisição abra apenas um DBContext e use o mesmo em até o fim dela
}