Pergunta

A injeção de dependência potencialmente causa uma sobrecarga grande?

Eu imagino que assim, especialmente se o resolvedor for chamado muitas vezes (o que provavelmente está olhando para exemplos de padrões)? Ou estou pensando errado? Infelizmente, não consigo testar para mim, pois nunca o usei, mas planejei usá -lo.

Foi útil?

Solução

A menos que você esteja usando um localizador de serviço, Duvido que a sobrecarga faça uma diferença significativa. (Mesmo se você for, é improvável que seja significativo.)

Usando a injeção do construtor e uma estrutura moderna, o resolvedor será chamado quando os objetos forem construídos. Na maioria das vezes, suspeito que você descobrirá que os objetos com dependências são componentes de nível relativamente alto, de vida longa ou ambos.

Se você está usando um contêiner do COI e criando um muito de objetos com dependências em um loop apertado, você poderia precisa fazer alguma otimização. Você sempre pode perfilar ou compará -lo.

Em suma, eu não me preocuparia com isso.

Outras dicas

A injeção de dependência como conceito não precisa ter uma sobrecarga alta: é simplesmente estruturar uma classe para que suas conexões com outras classes possam ser construídas no tempo de execução, em vez de serem conectadas ao código.

Obviamente, existem maneiras de construir essa conexão em tempo de execução que pode ter alta sobrecarga. Evite essas maneiras.

http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html Para alguns testes de desempenho. Cada teste estava executando 1000000 criações.

Observe que o benchmark mostra resolução de singleton e resolução transitória: um singleton está lá, você registra uma instância de uma classe, por exemplo (usando unidade):

container.RegisterInstance<IMyType>(new ConcreteMyType());

E esta instância é retornada toda vez (o que é bastante rápido).

Um transitório é onde você registra apenas o tipo de classe e a estrutura do COI fará o trabalho de criá -lo para você, por exemplo (em unidade)

container.RegisterType<IMyType, ConcreteMyType>();

Isso leva mais tempo para que retornar um singleton.

Em termos de otimização geral, a sobrecarga da injeção de dependência é uma cerveja pequena; Outros gargalos de desempenho têm maior probabilidade de serem as coisas a otimizar.

Injeção de dependência por si só é apenas uma indireção simples, então há uma sobrecarga, mas é realmente muito menor. O padrão de tempo de execução corresponde e resolvendo é outra coisa (mas, embora frequentemente usada com injeção de dependência, não é como se DI demandas Tais extras ;-).

A injeção de dependência não vai dar uma sobrecarga enorme. Tenho certeza de que você encontrará gargalo em outro lugar. Se você está preocupado com a sobrecarga pode ser que C# não seja o idioma que você deseja usar. Você usa o C# para benefícios traz, abstrair alguns detalhes com os quais você não deseja lidar.

O mesmo com o DI, ele também tem benefícios como tornar seu aplicativo vagamente acoplado e isso significa que será mais fácil para você mantê -lo no futuro.

Código de sobrecarga versus testável e sustentável ... Escolho código testável e sustentável (você sempre pode comprar um computador mais rápido)

=)

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