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.
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.
Respostas:
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 :
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 .
Depende do que você está procurando, pois cada um tem seus prós e contras.
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.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.Structure Map
possui configuração muito rica e refinada através de uma DSL interna.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.Ninject
Ouvi dizer que é mais um esqueleto com menos é mais abordagem (não é experiente).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.
Autofac. https://github.com/autofac/Autofac É realmente rápido e muito bom. Aqui está um link com comparações (feitas após o Ninject corrigir um problema de vazamento de memória).
http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html
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.
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.
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.
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.
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.
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.
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!
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.
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.