8
respostas

IoC com o Ninject

Durante o curso, utilizamos o Ninject para prover a session para o Dao a fim de evitar a repetição do código. Mas, percebi que só temos este recurso (no mesmo modelo apresentado no curso) para MVC. E se eu tiver uma aplicação Windows Forms ou WPF utilizando qualquer outro padrão de programação?

Estou realizando testes com um console app referenciando o dao em outro projeto simples de classes. Existe alternativa para os outros padrões ou vou ter que abrir a sessão e o transaction manualmente toda vez que utilizar o dao?

8 respostas

Olá!

O Ninject realmente é exclusivo para MVC, só trabalhando com aplicações web. Porém, ele não é o único container de injeção de dependências do .NET, só é um dos mais famosos e utilizados.

Outros dois que me lembro agora de cabeça são o Autofac e o DryIoC. Tem bastante conteúdo sobre os dois na internet, inclusive em português. Dê uma olhada e veja qual atende suas expectativas.

Além disso, o .NET Core vem com um container de injeção de dependências por padrão, é o Essential .NET

Será que alguma destas duas opções me ajuda a criar a session e o transaction do NHibernate sem ter que declarar isso manualmente antes de cada movimentação no banco?

Eu gostei muito disso no Ninject. O problema é justamente esse: não estou usando o MVC.

Olá!

Eu descobri algumas informações interessantes que eu também não tinha noção. Parece que o Ninject pode sim ser usado fora do MVC.

Tem um artigo na DZone que fala sobre o uso de Ninject em um projeto WPF:

https://dzone.com/articles/using-ninject-mvvm-light

Só está em inglês o artigo.

Maneiro! Estava dando uma lida aqui. Parece bem simples na aplicação do registro dos serviços em MVVM.

Mas, aí que está o detalhe: eu gostaria de implementar o Ninject ou qualquer outro IoC no sistema simples de Loja que construímos durante o curso. Não o LojaWeb que foi construído em MVC, mas sim o console que desenvolvemos enquanto assistimos às aulas.

Veja que, durante às aulas, o instrutor utiliza a declaração explícita das sessions e transactions, mas durante os exercícios, existe a possível utilização do Ninject por conta do projeto para a tarefa estar em MVC.

Se eu conseguir utilizar o Ninject no projeto de Console para realizar a abertura das sessions do NHibernate e utilizar os transactions como apresentados nos Filters do projeto LojaWeb, conseguirei resolver o meu problema com o projeto maior que estou desenvolvendo, independente da plataforma.

Embora eu esteja procurando aqui na internet, não consigo nenhum material com uma ideia desta implementação. Todos estão amarrados de alguma forma a algum framework ou tipo de projeto.

Olá,

Veja se esse código fonte aqui é o que você quer:

https://gist.github.com/jarrettmeyer/4685025

Nele tem a classe NHibernateSessionManager e a configuração do Ninject no final.

Eu estava exatamente com essa página aberta aqui. Rs

Estou tentando fazer algumas adaptações para testar, pois algumas rotinas não batem com a estrutura que implementei no projeto desenvolvido durante o curso. Mas, vamos lá! De repente é isso mesmo.

Consegui fazer as adaptações e, abrindo enviando a sessão pelo program, está funcionando. Mas, não consegui implementar o Ninject ainda.

Eu fiz a instalação pelo Nuget, porém eu não faço ideia de onde coloco o código correspondente ao bind do session:

Kernel.Bind<ISession>().ToMethod(_ => NHibernateSessionManager.CurrentSession).InTransientScope();
Kernel.Bind<IStatelessSession>().ToMethod(_ => NHibernateSessionManager.CurrentStatelessSession).InTransientScope();

Eu tenho que criar uma classe chamada NinjectDatabaseConfiguration.cs com estas linhas de código? Fica armazenada em um App_start da vida ou algo assim?

Não. Isso fica no seu método Main mesmo.

Mas eu achei duas outras fontes bem melhores:

http://www.c-sharpcorner.com/UploadFile/4d9083/dependency-injection-using-ninject-in-net/

http://blog.agilistic.nl/a-step-by-step-guide-to-using-ninject-for-dependancy-injection-in-c-sharp/

Dá uma olhada.