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.

pbreault
fonte
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 .

RobertTheGrey
fonte
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.

Glenn Block
fonte
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.

ScottKoon
fonte
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.

Steven
fonte
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.

Chris Canal
fonte
5

Eu posso recomendar o Ninject. É incrivelmente rápido e fácil de usar, mas apenas se você não precisar de configuração XML, você deve usar o Windsor.

Julio Cesar
fonte
11
NÃO é rápido! É uma das estruturas de DI mais lentas do mercado! palmmedia.de/Blog/2011/8/30/…
Serj Sagan
@Serj Sagan Para ser justo, esses resultados são antigos (6 anos de idade agora)
Timothy Kanski
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.

outinsun
fonte
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.

Jason Sparks
fonte
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!

Ian Patrick Hughes
fonte
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.

Rob Bazinet
fonte
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.

David Robbins
fonte