1
resposta

Injeção de Dependência quando tem mais de 1 projeto na Solution

Olá, estou fazendo um projeto meu e estou com dificuldades quanto a Injeção de Dependência.

Na minha Solution, existem 3 projetos separados:

1 - projeto Web (front-end MVC) 2 - aplicacao (responsável pelas regras de negócio) 3 - dominio (contém as classes do projeto (pessoa, produto, etc)) 4 - dados (responsável pela comunicação com o banco de dados através do Entity Framework)

Minha intenção é fazer com que o controller receba uma requisição para adicionar um novo produto por exemplo... Então o ProdutoController (projeto 1) chama o ProdutoAplicacao (projeto 2) e passa um objeto da classe Produto para essa aplicacao. A classe ProdutoAplicacao vai então fazer o que tem de fazer e chamar a classe ProdutoRepositorio (projeto 4) para salvar no banco de dados.

Ai entra a injeção de dependência... Como posso fazer ela? Alguém pode me ajudar detalhadamente, por favor?

Eu consigo fazer funcionar, se na classe que estou eu fizer uma instância da classe para onde quero ir... Mas isso gera um alto acoplamento entre classes, o que não é certo, apesar de funcionar...

Obrigado

EDIT:

dando uma pesquisada, eu fiz da seguinte forma, mas não acho que esteja correto:

usando o Ninject. Eu criei 2 interfaces, uma para a aplicacao e ourta para o repositorio. Então fiz com que o UsuarioController tinha o seguinte construtor (projeto 1):

private IAplicacaoBase<Usuario> _usuarioAplicacao;

  public UsuarioController (IAplicacaoBase<Usuario> usuarioAplicacao)
  {
      this._usuarioAplicacao = usuarioAplicacao;
  }

o construtor da UsuarioAplicacao (projeto 2):

private readonly IRepositorioBase<Usuario> _usuarioRepositorio;


public UsuarioAplicacao (IRepositorioBase<Usuario> usuarioRepositorio)
{
    this._usuarioRepositorio = usuarioRepositorio;
}

e o construtor da UsuarioRepositorio (projeto 4):

private readonly Contexto _contexto;

        public UsuarioRepositorio(Contexto contexto)
        {
            this._contexto = contexto;
        }

com o Ninject instalado no projeto Web (1), eu adicionei la o que era necessario para ele gerenciar as dependências, porém na hora de adicionar o kernel.Bind().To()

eu não consegui, por que o projeto 1 não tem referência para o projeto 4 (pq o front-end não deve ver a camada de banco de dados)

1 resposta

Oi, José!

Eu acho que pode ser mais simples do que isso. Por exemplo, se o projeto Web possui referência para o projeto Aplicacao, isso significa que tem acesso aos binários dela.

Já tentou fazer um AplicacaoContext com as classes que quer injetar? Veja o que foi feito para injetar as entidades:

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

Você poderia ter uma segunda linha registrando o serviço das classes da Aplicacao:

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

Já tentou fazer dessa forma? Eu não cheguei a testar e nunca fiz nada do tipo, estou indo só na idéia, me perdoe se não der certo de primeira rs.