Prima di tutto, sì. Usare un IoC in questo modo è un anti-modello. Hai una variabile globale sotto mentite spoglie.
È naturale che le dipendenze "esplodano" verso il punto di ingresso del programma e che i costruttori crescano di dimensioni. Questa è solo la natura della bestia. Tuttavia, facciamo un passo indietro e poniamoci una domanda.
Why do we want DI to begin with?
Vogliamo DI in modo che possiamo facilmente falsificare le dipendenze per test più facili. Sono testati. Questi enormi costruttori non devono mai essere chiamati nel codice di produzione.
Puoi usare un IoC per questo, ma non devi. Abbandona se vuoi.
Potrei ottenere una crema per questo, ma qui non va niente ...
Ho scelto questo trucco da Lavorare efficacemente con il codice legacy di Michael Feathers , ma vorrei essere chiaro che Sto abusando della tecnica per ridurre le dimensioni dei costruttori che vengono effettivamente chiamati nel codice di produzione.
Molto spesso, le dipendenze lungo la catena non cambiano in fase di esecuzione. Sono effettivamente costanti, ma vogliamo ancora la capacità di fingere quelle dipendenze. Considera il seguente esempio. (Scusa il mio C # per favore)
public class Class1
{
public Class1(Foo foo, Bar bar, Qux qux)
{
//...
}
}
In realtà, il nostro codice di produzione utilizza sempre gli stessi valori per tutti i nostri parametri. Va bene. Sovraccaricare il ctor e creare le nuove istanze al suo interno. (È una bestemmia, lo so. Non importa, funziona.)
public class Class1
{
public Class1(Foo foo, Bar bar, Qux qux)
{
//....
}
public Class1()
:this(new Foo(), new Bar(), new Qux())
{
//...
}
}
Ora il tuo codice di produzione chiama il costruttore senza parametri ei tuoi test chiamano il costruttore real . Problema risolto. Non è necessario alcun quadro di fantasia. Certo, dovrebbe essere un modo per realizzare la stessa cosa con il tuo framework IoC, ma senza conoscere i dettagli di quello che stai usando, non posso dire come. Sfortunatamente, VB.Net non ha lo stesso amore quando si tratta di framework come C #. Indipendentemente da ciò, ho pensato che dovresti vedere il modo "veloce e sporco" per farlo. È sempre possibile passare a un contenitore IoC in un secondo momento, quando i progetti sono sufficientemente complessi da giustificarlo.