Considerare questo scenario. Ho una logica di business che di tanto in tanto sarà necessario scrivere su un log.Quale modello utilizzare per la registrazione? Iniezione delle dipendenze o localizzatore di servizi?
interface ILogger
{
void Log(string stuff);
}
interface IDependency
{
string GetInfo();
}
class MyBusinessObject
{
private IDependency _dependency;
public MyBusinessObject(IDependency dependency)
{
_dependency = dependency;
}
public string DoSomething(string input)
{
// Process input
var info = _dependency.GetInfo();
var intermediateResult = PerformInterestingStuff(input, info);
if (intermediateResult== "SomethingWeNeedToLog")
{
// How do I get to the ILogger-interface?
}
var result = PerformSomethingElse(intermediateResult);
return result;
}
}
Come si ottiene l'interfaccia di ILogger? Vedo due possibilità principali;
- Passarlo utilizzando Iniezione di dipendenza sul costruttore.
- Scaricalo tramite un localizzatore di servizi singleton.
Quale metodo preferiresti e perché? O c'è un modello ancora migliore?
Aggiornamento: Nota che non è necessario registrare TUTTE le chiamate di metodo. Voglio solo registrare alcuni (rari) eventi che potrebbero verificarsi o meno nel mio metodo.
una terza opzione sarebbe l'iniezione di proprietà (utilizzando attributi), che potrebbe evitare di ingombrare il costruttore –