Pergunta

Estou pensando em usar Microsoft Unidade para a minha ferramenta Dependency Injection na nossa interface do usuário.

Nível Nossa Oriente já usa Castelo de Windsor, mas eu estou pensando que eu deveria ficar com Microsoft.

Alguém tem alguma opinião sobre qual é a melhor ferramenta Dependency Injection é?

Foi útil?

Solução

Furar a um contêiner não é realmente importante, se o sistema foi concebido com o IOC / DI em mente. Com a abordagem adequada, você pode facilmente mudar a biblioteca IoC abaixo da estrada.

E, claro, o recipiente tem para oferecer flexibilidade suficiente para suporte comuns cenários amplamente utilizados (gestão do ciclo de vida, assentamento recipiente apropriado, configuração XML e código, interceptação, rápida resolução).

Eu recomendo para escolher entre o Castelo (amplamente utilizado e tem um monte de bibliotecas de integração) e Autofac (leve, rápido e tem nidificação recipiente apropriado, mas não é que amplamente utilizado)

Há um lista abrangente de recipientes de IoC por Hanselman

PS: Você não quer usar Unity

Outras dicas

Tendo recentemente cravado o uso de 6 deles ( Windsor , Unidade , Spring.Net , Autofac , Ninject , StructureMap ) eu posso oferecer uma rápida resumo de cada, nossos critérios de selecção e nossa escolha final.

Nota: nós não olhar para PicoContainer.Net como um dos nossa equipe considerada a porta .Net ser bastante pobre da versão Java. Nós também não olhou para ObjectBuilder, como unidade é construída em cima de ObjectBuilder2 e foi considerado uma escolha superior por padrão.

Em primeiro lugar, posso dizer que mais ou menos todos eles são todos muito semelhantes e realmente se resume ao que realmente funciona melhor para você e suas necessidades específicas. Nossos requisitos incluídos:

Requisitos

    injeção de base
  • Construtor (pretendemos não de usar a propriedade, campo ou injeção de método)
  • configuração Programável ( não XML)
  • hierarquias recipiente (um por aplicativo, por pedido e por sessão para alcance mais implicitamente ligam vidas de componentes para o recipiente)
  • gestão de vida útil dos componentes (para mais granular escopo por exemplo, transiente / Singleton)
  • de injecção a partir da interface com o tipo ou exemplo concreto (por exemplo ILogger -> typeof(FileLogger) ILogger -> new FileLogger() ou)
  • criação de componentes avançado / "mecanismo de eventos Creaton" para pré / pós inicialização
  • descarte correto de componentes IDisposable em lágrima recipiente para baixo
  • bem documentada e / ou informações on-line disponíveis

    Nota: enquanto o desempenho era uma exigência não foi consignado na seleção como parecia que todos os recipientes foram revisados ??de acordo com semelhante a este referência

Test

Cada recipiente foi usado em um Asp.Net típico WEBFORMS projecto (como o nosso tipo de aplicação alvo). Foi utilizado um único página simples com um único com controlo de utilizador simples, cada herdar a partir de um controlo de página de base / base, respectivamente. Utilizou-se um recipiente no BasePage para um "pedido por" recipiente âmbito e um no Global.asax para um âmbito de "aplicação" e tentou cadeia-los em conjunto de modo dependências poderia ser resolvido a partir de ambos os recipientes.

Cada aplicação web compartilhado um conjunto artificial de objetos de domínio simulação multi-níveis de dependência, de tipo de escopo (singleton / transitória) e também de aulas gerenciados e não gerenciados (IDisposable necessário). O "nível superior" componentes de dependência foram injectados manualmente a partir dos métodos no BasePage.

Resultados

Windsor - preenche todos os critérios e tem um bom histórico de caso, comunidade blogger e documentação online. Fácil de usar e provavelmente a escolha defacto. criação de componentes avançados através de instalação de fábrica. Também permitiu encadeamento de recipientes criados individualmente.

Spring.Net - detalhado e inútil de documentação e não-óbvia / fácil para a configuração programável. não apoiar genéricos. Não escolhido

Ninject - Fácil de usar, com boa documentação clara. conjunto poderoso recurso de cumprir todos os nossos requisitos, exceto hierarquias recipiente por isso, infelizmente não foi escolhido.

StructureMap - mal documentados, embora teve um grande conjunto de recursos avançados que atendeu a todas as nossas necessidades, no entanto, há nenhum foi construído-in mecanismo para hierarquias recipiente embora poderia ser cortado em conjunto, utilizando para loops ver aqui A expressão lambda interface fluente parecia um pouco mais complicado à primeira vista, embora poderia ser encapsulado afastado

Unity - Bem documentado, fácil de usar e atender todas as critérios de selecção e tem um mecanismo de extensão fácil de adicionar o mecanismo de criação de eventing pré / pós que for necessário. recipientes criança teve que ser criado a partir de um recipiente pai.

Autofac - Bem documentado e relativamente fácil de usar, embora a configuração expressão lambda parece um pouco mais complicado no entanto, mais uma vez, pode ser facilmente encapsulado de distância. escopo de componentes é conseguido através de um mecanismo de "marcação" e todos os componentes são configurados na frente usando um construtor que foi um pouco inconveniente. recipientes filhos foram criados a partir de um pai e componentes atribuídos a partir de um "tag". Permitiu injeção genérico.

Conclusão

A nossa escolha final foi entre Windsor e Unidade, e desta vez optamos Unity devido à sua facilidade de uso, documentação, sistema de extensão e com ele estar em estado de "produção".

Aqui está um bom artigo que compara recipientes .NET COI. http: // blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

Eu comecei usando Autofac há um ano e não olhou para trás desde então ..

Eu sou um fã Autofac, mas ambos Windsor e Unidade vai fazer um bom trabalho (embora Windsor é mais capaz do que a unidade e não necessita de atribuir o seu código). Há uma abundância de boas razões não técnicas para furar a um único recipiente em um sistema embora.

Use o que funciona. A maioria tem características que são únicas para eles, e quase todos são mais de Unity rica em recursos. Se a unidade é tudo o que você precisa, você pode certamente usá-lo.

Usando a unidade da Microsoft só porque é da Microsoft é uma má maneira de tomar uma decisão. Pense no que você precisa e por quê, e escolher aquele que se adapta às suas necessidades.

No entanto, eu segundo a noção de que adere a um único recipiente, se possível.

Estou usando o Managed Extensibility Framework e achei muito fácil de trabalhar. Tem sido integrado no .NET 4 .

A menos que você já tem experiência e uma preferance pessoal para um determinado sub-tecnologia utilizada por uma das possíveis soluções contêiner IoC, todos eles funcionam bem e não vejo qualquer um em particular com uma função "assassino" que faz ele se destaca dos outros. A unidade é provavelmente o melhor ajuste para soluções já utilizam a P & P Enterprise Library 4.x ...

IoC Container de Referência - Comparação de desempenho tem um desempenho e apresenta tabelas de comparação para mais de 20 produtos e mantê-los up-to-date.

A conclusão do artigo:

SimpleInjector, Hiro, Funq, Munq e Dynamo oferecer o melhor desempenho, eles são extremamente rápidos. Dê-lhes uma tentativa!

Injector simples parece ser uma boa escolha. É muito rápido, tem um bom documentação e também suporta cenários avançados, como a intercepção e decoradores genéricos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top