Ninject vs Unity para DI [fechado]

104

Estamos usando ASP.net MVC.

Qual destes é o melhor framework de DI Ninject ou Unity e por quê?

Miral
fonte
94
O NInject é melhor porque você pode comprar ímãs legais de marca em seu site.
Ivan G.
5
Versão atualizada desta pergunta (muito semelhante de qualquer maneira) que algumas pessoas podem achar útil: stackoverflow.com/questions/4581791/…
Jason Down

Respostas:

46

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.

Mendelt
fonte
47
Você só precisa usar o atributo Inject se houver mais de um construtor e você precisa dizer ao Ninject qual construtor usar. Por padrão, ele usa o construtor com o maior número de parâmetros.
Jeffrey Cameron
11
Nesse ínterim, há também uma extensão oficial Ninject.Web.Mvc. Você altera seu MvcApplication para derivar de NinjectHttpApplication, ativa o Kernel nele e chama RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) para que ele cuide de todos os controladores no assembly fornecido. Magia.
Michael Stum
18
Essa resposta agora é bastante irrelevante com relação ao Ninject 2. Embora a reclamação fosse legítima para o Ninject 1, o Ninject 2 permite que se trabalhe sem sobrecarregar as classes com atributos. ninject2 irá operar de forma transparente sem a necessidade de modificar suas classes.
chillitom de
3
O mesmo para unidade, pois parece ser completamente configurável via código neste momento (v3.0.1304.1)
Eric
46

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.

roberocidade
fonte
10

O Ninject detecta dependências circulares se você usar Injection Constructors em oposição ao Unity que, independentemente da técnica de injeção, apenas lança uma StackOverflowException que é extremamente difícil de depurar.

IMLiviu
fonte
9

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.

João leino
fonte