Domanda

L'iniezione di dipendenza può potenzialmente causare grandi spese generali?

Immagino di sì, specialmente se il resolver viene chiamato più volte (il che è molto probabilmente guardando esempi di schemi)? O sto pensando male? Sfortunatamente non posso provare da solo poiché non l'ho mai usato ma ho pianificato di usarlo.

È stato utile?

Soluzione

A meno che tu non stia utilizzando un localizzatore di servizi , dubito che l'overhead fare una differenza significativa. (Anche se lo sei, è improbabile che sia significativo.)

Usando l'iniezione del costruttore e un framework moderno, il resolver verrà chiamato quando gli oggetti vengono costruiti. Per la maggior parte sospetto che scoprirai che gli oggetti con dipendenze sono componenti di livello relativamente alto, di lunga durata o entrambi.

Se stai usando un contenitore IoC e stai creando un lotto di oggetti con dipendenze in un ciclo stretto, potresti fare qualche ottimizzazione. Puoi sempre profilarlo o confrontarlo.

In breve, non me ne preoccuperei.

Altri suggerimenti

L'iniezione di dipendenza come concetto non deve necessariamente avere un elevato sovraccarico: sta semplicemente strutturando una classe in modo che le sue connessioni ad altre classi possano essere costruite in fase di esecuzione piuttosto che essere cablate nel codice.

Naturalmente, ci sono modi per creare quella connessione di runtime che potrebbe avere un sovraccarico elevato. Evita questi modi.

http://www.codinginstinct.com /2008/04/ioc-container-benchmark-unity-windsor.html per alcuni test delle prestazioni. Ogni test eseguiva 1000000 creazioni.

Nota che il benchmark mostra la risoluzione singleton e la risoluzione transitoria: un singleton è lì che registri un'istanza di una classe ad es. (usando Unity):

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

e questa istanza viene restituita ogni volta (che è abbastanza veloce).

Un transitorio è dove registri solo il tipo di classe e il framework IoC farà il lavoro di crearlo per te, ad es. (in Unity)

container.RegisterType<IMyType, ConcreteMyType>();

Ciò richiede più tempo rispetto alla restituzione di un singleton.

In termini di ottimizzazione generale, il sovraccarico dell'iniezione di dipendenza è la birra piccola; altri colli di bottiglia delle prestazioni hanno maggiori probabilità di essere le cose da ottimizzare.

Iniezione di dipendenza di per sé è solo una semplice direzione indiretta, quindi c'è un sovraccarico ma in effetti è piuttosto minore. La corrispondenza e la risoluzione dei modelli di runtime sono un'altra cosa (ma mentre sono spesso utilizzati con Iniezione delle dipendenze, non è come se DI richieda tali extra ;-).

L'iniezione di dipendenza non genererà enormi spese generali. Sono sicuro che troverai un collo di bottiglia da qualche altra parte. Se sei preoccupato tanto dell'overhead potrebbe essere C # non è la lingua che vuoi usare. Usi C # per i vantaggi che comporta, estrae alcuni dettagli con cui non vuoi occuparti.

Lo stesso con DI, ha anche vantaggi come rendere la tua applicazione debolmente accoppiata e ciò significa che sarà più facile per te mantenerla in futuro.

Codice overhead vs testabile e gestibile ... Scelgo codice testabile e gestibile (puoi sempre acquistare un computer più veloce)

=)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top