Estamos usando ASP.net MVC.
Qual destes é o melhor framework de DI Ninject ou Unity e por quê?
Estamos usando ASP.net MVC.
Qual destes é o melhor framework de DI Ninject ou Unity e por quê?
Respostas:
A última vez que olhei para qualquer um deles, achei Ninject um pouco melhor. Mas ambos têm suas desvantagens.
O Ninject tem um esquema de configuração fluente melhor. O Unity parece depender principalmente da configuração XML. A principal desvantagem do Ninject é que ele exige que você faça referência a Ninject.Core em todo o seu código para adicionar atributos [Inject].
Se posso perguntar, por que você está limitando suas escolhas a esses dois? Eu acho que Castle.Windsor, Autofac e StructureMap são pelo menos tão bons ou melhores.
Eu sei que esta é uma questão antiga, mas aqui estão meus pensamentos:
Eu pessoalmente gosto do Ninject. Gosto das interfaces fluentes e evitando XML. Eu geralmente gosto de XML, mas não para esse tipo de coisa de configuração. Especialmente quando a refatoração está envolvida, as interfaces fluentes facilitam a correção.
Sinto falta da ObjectFactory do StructureMap, mas existem soluções fáceis para adicioná-la ao Ninject.
Como Jeffery aponta, você não precisa usar o atributo [Inject] quando você tem apenas um construtor.
Descobri que prefiro as interfaces fluentes não apenas porque evitam XML, mas porque causam erros de tempo de compilação quando altero algo que as afetou. A configuração XML não e, quanto menos eu tiver que me lembrar de mudar, melhor para mim.
Eu concordo com Mendelt, não existe uma "melhor" estrutura de DI. Depende apenas da situação e todos eles têm prós e contras. acho que David Hayden disse no DotNet Rocks que o Unity é a escolha preferida se você usar o resto do EntLib e estiver familiarizado com ele. Eu pessoalmente uso o Unity porque meu cliente gosta do fato de dizer Microsoft Enterprise Library (Unity) nas DLLs, se é que você me entende.
Eu uso tanto a configuração xml para configurar as interfaces quanto suas implementações concretas, mas uso atributos no código ao injetar, como:
<type type="ILogger" mapTo="EntLibLogger">
<lifetime type="singleton"/>
</type>
e no código:
[InjectionConstructor]
public Repository([Dependency] ILogger logger)
Pessoalmente, acho que isso deixa mais claro o que acontece, mas é claro que alguém poderia argumentar que você terá referências à unidade em toda a sua aplicação. Você decide.
http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison
O Unity é mais rápido, mas não é o melhor