Ninject - OwinHost e WebHost

  • Rafael Miceli
  • 13 Abr 2016

Quando temos uma aplicação como a aplicação de escola que possuímos de exemplo (se quiser pode pegar no meu Github), imagina se queremos inicializar todas as dependências que temos? Vamos fazer isso no construtor dos Controllers? Imagina para cada Controller fazer isso? Imagina mais, imagina ter de inicializar um grafo de dependências bem grande? O tamanho do construtor e o problema em manutenções futuras que isso pode gerar?

Para isso usamos D.I. Containers. E neste post vamos ver como usar o Ninject em nossa aplicação. Lembrando que existem muitos outros, aqui alguns só para listar:

  • Ninject
  • AutoFac
  • Castle Windsor
  • Unity

E muitos outros…

Ninject

O Ninject é um dos mais famosos frameworks de D.I. Container e se queremos usar ele para orquestrar as instâncias de nosso sistema temos antes de definir qual biblioteca do Ninject usar em nossa aplicação.

Vamos preparar inicialmente para nossas instâncias funcionarem tanto para MVC quanto para WebApi.

Para isso instalamos os pacotes:

  • Ninject
  • Ninject.MVC5
  • Ninject.Web.Common
  • Ninject.Web.WebApi

Para instalar os pacotes, dentro do Visual Studio abra a janela Package Manager Console dentro dessa janela no topo dela na opção Default project selecione a aplicação Web e execute o commando:

Install-Package Ninject

Faça esse comando para cada um dos packages listados acima.

Para finalizar a instalação do Ninject vamos depender de como estamos inicializando nossa aplicação Asp.Net.

Ninject Webhost

Caso não estejamos usando OWIN para inicializar nossa aplicação, e estamos usando o IIS como host, então instalamos em nossa aplicação o pacote Ninject.Web.Common.WebHost.

Ao instalar vai ser criado um arquivo NinjectWebCommon.cs no App_Start, aonde nele vamos mapear nossas instâncias da aplicação.

Para isso, dentro da classe NinjectWebCommon.cs, no método RegisterServices vamos implementar o código:

NinjectWebCommon.cs

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMateriaRepo>().To<MateriaRepository>().InRequestScope();
    kernel.Bind<IMateriaService>().To<MateriaService>().InRequestScope();
}        

Ninject OwinHost

Caso estejamos usando o owin, então instalamos o pacote Ninject.Web,Common.OwinHost.

Usando o OwinHost, no método Configuration do nosso Startup.cs precisamos do seguinte código:

public void Configuration(IAppBuilder app)
{
    //HttpConfig
    var config = new HttpConfiguration();            

    //Web Api Configuration
    ConfigureWebApi(config);

    //Ninject Configuration
    app.UseNinjectMiddleware(() => NinjectBootstraper.CreateKernel.Value);
    app.UseNinjectWebApi(config);
}

E para termos separado o mapeamento de nossas dependências, vamos criar uma classe chamada NinjectBootstraper.cs no App_Start com a seguinte implementação:

public static class NinjectBootstraper
{
    public static Lazy<IKernel> CreateKernel = new Lazy<IKernel>(() =>
    {
        StandardKernel kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());

        RegisterServices(kernel);

        return kernel;
    });

    private static void RegisterServices(KernelBase kernel)
    {
        kernel.Bind<IMateriaRepo>().To<MateriaRepository>().InRequestScope();
        kernel.Bind<IMateriaService>().To<MateriaService>().InRequestScope();
    }
}

Excelente!

Vimos duas formas de configurar nossa aplicação com o Ninject. Existe mais uma que é o SelfHost, mas não vou cobrir ela aqui.

Um detalhe bem importante.

Não misture os pacotes OwinHost e WebHost, tenha apenas referência a um em seu projeto. Pois quando você tem referência aos dois você recebe uma exceção.

comentarios com Disqus Disqus