Quais estruturas de injeção de dependência do .NET valem a pena examinar? [fechadas]


386

Quais estruturas de injeção de dependência em C # / .NET valem a pena examinar? E o que você pode dizer sobre sua complexidade e velocidade.


13
IoC Container Benchmark - A comparação de desempenho possui tabelas de comparação de desempenho e recursos para mais de 20 produtos e os mantém atualizados. Ele recomenda o Simple Injector #
— Michael Freidgeim 22/03

Eu aprecio o Ninject & Maestro. Estou feliz que o topo resposta avaliado reffer Ninject como "um prazer absoluto"
— Razvan Dumitru

6
Eu enfatizaria que, antes de olhar para os contêineres IoC, você deve gerenciar sem um. Faça sua fiação e injeção manualmente, não é realmente complicado ou exige muito código, a menos que você tenha sistemas realmente grandes ou complexos. Quando você sentir que entende e está se tornando agressivo, ficará mais preparado para entender que tipo de estrutura o ajudaria. mas não existe uma regra que diga que um projeto DEVE ter um contêiner de IoC apenas para poder fazer DI corretamente.
— Sara

11
Comece com nenhum. Crie o gráfico de objetos necessários manualmente. Estruturas diferentes tem abordagens diferentes, que dependem de suas necessidades. Antes de escolher um, você precisa reconhecer quais recursos você mais precisa.
— Fabio

Como o dotnetcore é o futuro, você também pode se ater ao seu suporte DI integrado. É muito bom e altamente personalizável.
— ATL_DEV 20/09/19

Respostas:


340

editar (não pelo autor): Existe uma lista abrangente de estruturas de IoC disponíveis em https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Castle Windsor - Castle Windsor é o melhor da categoria, contêiner maduro de Inversão de Controle disponível para .NET e Silverlight
  • Unity - Contêiner de injeção de dependência extensível e leve, com suporte para injeção de construtor, propriedade e chamada de método
  • Autofac - um contêiner .NET IoC viciante
  • DryIoc - Recipiente IoC simples, rápido e com todos os recursos.
  • Ninject - O ninja dos injetores de dependência do .NET
  • StructureMap - O contêiner IoC / DI original para .Net
  • Spring.Net - Spring.NET é uma estrutura de aplicativos de código aberto que facilita a criação de aplicativos .NET corporativos
  • LightInject - Um contêiner de IoC ultra leve
  • Simple Injector - Simple Injector é uma biblioteca de Injeção de Dependência (DI) fácil de usar para .NET 4+ que suporta Silverlight 4+, Windows Phone 8, Windows 8, incluindo aplicativos universais e Mono.
  • Microsoft.Extensions.DependencyInjection - O contêiner IoC padrão para aplicativos ASP.NET Core.
  • Scrutor - Extensões de verificação de montagem para Microsoft.Extensions.DependencyInjection.
  • VS MEF - implementação da Estrutura de extensibilidade gerenciada (MEF) usada pelo Visual Studio.
  • TinyIoC - Um contêiner de inversão de controle fácil de usar e sem complicações para pequenos projetos, bibliotecas e iniciantes.

A resposta original segue.


Suponho que posso estar sendo um pouco exigente aqui, mas é importante observar que o DI (Injeção de Dependência) é um padrão de programação e é facilitado por, mas não requer, uma estrutura de IoC (Inversão de Controle). As estruturas de IoC tornam a DI muito mais fácil e fornecem uma série de outros benefícios além da DI.

Dito isto, tenho certeza que é isso que você estava perguntando. Sobre os frameworks IoC; Eu costumava usar Spring.Net e CastleWindsor muito, mas a dor real no trás era tudo o que traquinas de configuração XML você tinha que escrever! Eles estão praticamente se movendo dessa maneira agora, então eu tenho usado o StructureMap há mais ou menos um ano e, desde que ele mudou para uma configuração fluente usando genéricos fortemente tipados e um registro, minha barreira de dor ao usar a IoC caiu para abaixo de zero! Agora, fico sabendo que minha configuração de IoC é verificada em tempo de compilação (na maioria das vezes) e não tive nada além de me divertir com o StructureMap e sua velocidade. Não vou dizer que os outros eram lentos no tempo de execução, mas eles eram mais difíceis de configurar e frustração geralmente ganhava o dia.

Atualizar

Eu tenho usado o Ninject no meu projeto mais recente e foi um prazer absoluto usá-lo. As palavras me falham um pouco aqui, mas (como dizemos no Reino Unido) esse quadro é 'os Cães'. Eu o recomendaria muito para qualquer projeto de campo verde em que você queira começar a funcionar rapidamente. Eu consegui tudo o que precisava de um conjunto fantástico de screencasts do Ninject por Justin Etheredge. Não consigo ver esse Ninject retro-ajustado no código existente sendo um problema, mas o mesmo poderia ser dito do StructureMap em minha experiência. Será uma escolha difícil daqui para frente entre os dois, mas eu prefiro ter competição do que estagnação e há uma quantidade decente de competição saudável por aí.

Outros screencasts de IoC também podem ser encontrados aqui no Dimecasts .


11
É ótimo ver uma resposta de qualidade e bem pensada aumentar sobre os forros. Você me convenceu a conferir o StructureMap.
— Chris Marasti-Georg

7
Bom, mas para ser justo - Windsor agora também tem uma interface fluente muito boa.
— Krzysztof Kozmic

Você poderia explicar quais são as estruturas de IoC de "muitos outros benefícios", além da fácil implementação do DI?
— Fearofawhackplanet

@fearofawhackplanet Uma das únicas coisas que um contêiner de IoC pode fazer que não pode ser feito com o DI do pobre homem é a interceptação . Bom resumo aqui: kenneth-truyers.net/2013/05/16/…
— Mathieu Guindon

11
Eu li algumas fontes que dizem que o Ninject é o mais lento palmmedia.de/blog/2011/8/30/… e stackoverflow.com/questions/4581791/…
— Luke T. O'Brien

77

Depende do que você está procurando, pois cada um tem seus prós e contras.

  1. Spring.NETé o mais maduro que sai do Spring do mundo Java. O Spring possui um conjunto muito rico de bibliotecas de estrutura que o estendem para suportar Web, Windows, etc.
  2. Castle Windsoré um dos mais amplamente utilizados na plataforma .NET e possui o maior ecossistema, é altamente configurável / extensível, possui gerenciamento de vida útil personalizado, suporte AOP, possui suporte inerente ao NHibernate e é um contêiner incrível. O Windsor faz parte de uma pilha inteira que inclui o Monotrilho, o Active Record, etc. O próprio NHibernate se baseia no Windsor.
  3. Structure Map possui configuração muito rica e refinada através de uma DSL interna.
  4. Autofacé um contêiner de IoC da nova era com todo o suporte inerente à programação funcional. Ele também adota uma abordagem diferente sobre o gerenciamento da vida útil dos outros. O Autofac ainda é muito novo, mas aprimora o que é possível com a IoC.
  5. Ninject Ouvi dizer que é mais um esqueleto com menos é mais abordagem (não é experiente).
  6. O maior discriminador Unityé: é de e é suportado pela Microsoft (p & p). O Unity tem muito bom desempenho e ótima documentação. Também é altamente configurável. Ele não tem todos os sinos e assobios do Castelo / Mapa de Estrutura.

Então, em resumo, isso realmente depende do que é importante para você. Eu concordaria com os outros em avaliar, avaliar e qual deles se encaixa. O bom é que você tem uma ótima seleção de rosquinhas, em vez de precisar apenas de uma gelatina.


4
Autofac na verdade não é tão novo, ele é mais velho do que a unidade :)
— Nicholas Blumhardt

11
Eu disse que era mais novo que o Unity? Eu disse que é da nova era ... ou seja, eu quis dizer que é de natureza funcional. OK, o que eu disse ainda é muito novo, o que eu quis dizer foi que não é natureza que a TI seja nova. :-)
— Glenn Block

2
@Krzysztof - Acho o Unity extremamente fácil (pelo menos quando configurado fluentemente no código). O que você achou doloroso?
— TrueWill 19/01


6
Aqui está uma referência interessante de desempenho: palmmedia.de/Blog/2011/8/30/…
— Steven


18

Ninject é ótimo. Parece muito rápido, mas não fiz comparações. Eu sei que Nate, o autor, fez algumas comparações entre o Ninject e outras estruturas de DI e está procurando outras maneiras de melhorar a velocidade do Ninject.

Já ouvi muitas pessoas que respeito dizerem coisas boas sobre o StructureMap e o CastleWindsor. Na minha opinião, esses são os três grandes a serem observados agora.


11
Ninject é popular, mas certamente não é rápido. Na verdade, é um dos mais lentos por aí: palmmedia.de/Blog/2011/8/30/…
— Serj Sagan

13

Eu uso o Simple Injector :

O Simple Injector é uma biblioteca de injeção de dependência fácil, flexível e rápida que utiliza as melhores práticas para guiar suas soluções para o poço do sucesso.


4
Cuidado com alguns consideram o serviço de localizador de um anti-padrão, incluindo alguém que usou por algum tempo e até escreveu uma biblioteca para ele: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
— Philippe

4
Steven também é o criador do Simple Injector ... então essa é uma resposta meio spam ... especialmente porque ele usou uma conta alt para fazer isso ... Simple Injector é bem rápido: palmmedia.de/Blog/2011/ 8/30 /…
— Serj Sagan

8

Eu sou um grande fã de Castle. Adoro as instalações que ele também oferece além da história do IoC Container. Ele realmente simplifica o uso do NHibernate, log, AOP, etc. Eu também uso o Binsor para configuração com o Boo e realmente me apaixonei pelo Boo como idioma por causa disso.



5

Passei a maior parte de um dia lutando sem sucesso para obter o exemplo mais simples do Spring.NET funcionando. Nunca consegui descobrir como fazê-lo encontrar meu assembly a partir do arquivo XML. Em cerca de duas horas, por outro lado, consegui colocar o Ninject funcionando, incluindo testes de integração com o NUnit e o MSTest.


4

Eu usei o Spring.NET no passado e tive grande sucesso com ele. Eu nunca notei nenhuma sobrecarga substancial com ela, embora o projeto em que a usamos foi bastante pesado por si só. Demorou um pouco de tempo lendo a documentação para configurá-la.


2

O melhor do C # é que ele segue um caminho trilhado por anos de desenvolvedores de Java antes dele. Portanto, meu conselho, de um modo geral ao procurar ferramentas dessa natureza, é procurar a resposta sólida do Java e verificar se já existe uma adaptação do .NET.

Então, quando se trata de DI (e há tantas opções por aí, isso realmente é uma questão de gosto) é o Spring.NET . Além disso, é sempre aconselhável pesquisar as pessoas por trás dos projetos. Não tenho problema em sugerir produtos SourceGear para controle de origem (fora de usá-los) porque tenho respeito por Eric Sink. Vi Mark Pollack falar e o que posso dizer, o cara entende.

No final, existem muitas estruturas de DI e sua melhor aposta é fazer alguns projetos de amostra com alguns deles e fazer uma escolha instruída.

Boa sorte!


2

Eu acho que um bom lugar para começar é com o Ninject, é novo e levou em consideração muitas afinações e é muito rápido. Nate, o desenvolvedor, realmente tem um ótimo site e ótimo suporte.


Por que você está dizendo que é rápido ??? É um dos mais lentos que existem! palmmedia.de/Blog/2011/8/30/…
— Serj Sagan

2

Spring.Net é bastante sólido, mas a documentação levou algum tempo para ser analisada. O autofac é bom e, embora o .Net 2.0 seja suportado, você precisa do VS 2008 para compilá-lo ou use a linha de comando para criar seu aplicativo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.