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?