Quando si utilizza DI e opzionalmente un framework IoC un passo troppo lungo?

3

Considera un sistema di registrazione - usato assolutamente ovunque nella tua base di codice.

(nota: la registrazione è solo un esempio, non prenderla troppo alla lettera e indicarmi il tuo sistema di registrazione preferito).

public interface ILogger
{
    void LogMessage(string message);
}

// Just used for testing, do nothing
public class NullLogger : ILogger
{
    public void LogMessage(string message) { }
}

public class FileLogger : ILogger
{
    public FileLogger(string fileName){...}
    public void LogMessage(string message) { 
        // Log to a file here 
    }
}

No, potrei fare in modo che ogni singola classe abbia ILogger in ctor o param e utilizzare qualche framework IoC.

Oppure potrei semplicemente usare qualcosa come

public static class Globals
{
   public static ILogger Log = new NullLogger();
}

Utilizza in qualsiasi momento da Globals.Log.LogMessage("Hello Logging World");

E a "Compositon Root" (punto di ingresso principale del programma) imposta Globals.Log = new FileLogger("somefile.log");

O questo potrebbe essere fatto come Singleton, naturalmente.

Quando si usa DI e facoltativamente IoC un passo troppo lontano? Cosa faresti in questo caso?

    
posta Ryan 20.07.2012 - 20:35
fonte

2 risposte

3

La tua app deve funzionare? Sì? Quindi utilizzare DI.

La presenza di statiche rende il tuo codice problematico da testare automaticamente (poiché i test spesso devono essere eseguiti in parallelo per ridurre il tempo di turnover e per aiutare a verificare la concorrenza del tuo codice). Se non riesci a testare automaticamente il tuo codice, sarà più difficile farlo funzionare correttamente.

Ora, un contenitore IoC è probabilmente eccessivo. Personalmente, li ho visti causare più problemi (problemi di integrazione, sovraccarico della configurazione) di quanti ne avessero risolti. Ma avere almeno DI opzionale (che può essere impostato anche su un'istanza statica) ti aiuterà a evitare molti problemi.

Se hai un'app rapida che non ha realmente bisogno di funzionare completamente, allora sicuramente; incidere via. Altrimenti, prenditi il tempo necessario per farlo bene.

    
risposta data 20.07.2012 - 20:56
fonte
1
> using DI and optionally a IoC framework [is] a step too far

se tu

  • non voglio fare test automatici (unitari) e se tu
  • non hanno componenti separati dell'app (cioè dll) che devono essere modificati (o ricompilati) indipendentemente dall'app principale.
risposta data 21.07.2012 - 09:15
fonte