Sto cercando di capire come supportare il seguente scenario di esempio
sta usando C # come lingua di esempio.
Scenario
La NASA sta inviando Rovers e Satelliti a diversi Pianeti
questi veicoli richiedono molta registrazione e, per ridurre la confusione, vorrebbe poter filtrare questi registri nei seguenti modi:
dovrei essere in grado di combinare / scegliere uno di questi:
- Registra solo Rovers in Mercury
- Registra tutto su Marte
- registra tutti i satelliti
Attuazione
Grafico oggetto
quindiabbiamo3tipidioggetto,Planet,RovereSatellite
Laterracontiene3satelliti
Martecontiene1satellitee2Rover.
Mercurycontiene2satellitie1Rover.
ilsolitomododiaggiungereunregistroaglioggettiècometale:
publicclassMars:Planet{privatestaticILogLog=LogManager.GetCurrentClassLogger();}
questodisolitorestituisceunloggerchiamato"NASA.Mars" che rende semplice configurare semplicemente il framework per registrare tutte le "NASA.Mars" lo stesso accadrebbe con una Rover
public class Rover {
private static ILog Log = LogManager.GetCurrentClassLogger();
}
Avrei un logger chiamato "NASA.Rover"
ma come potrei sapere che il rover è in mercurio? poiché questo è un requisito del sottosistema di registrazione, non dovrebbe esistere come proprietà nella classe Rover .
Idea
Iniezione di dipendenza
se progetto le mie classi per accettare un'istanza di ILog nel costruttore potrei in teoria controllare un nome di registro degli oggetti figlio
(possibile utilizzare la classe genitore Pianeta , omessa per brevità)
public class Mars : Planet {
private static ILog Log = LogManager.GetCurrentClassLogger();
void Mars() {
this.Rovers.Add(new Rover(LogManager.GetLogger(Log.Name + ".Rover"));
}
}
public class Rover {
private ILog Log;
void Rover(ILog log) {
Log = log;
}
}
I miei problemi con questo approccio:
- la creazione di un logger per ogni oggetto figlio sembra una specie di "off", forse persino un anti-pattern
- questo può diventare molto complicato quando si ha a che fare con livelli più profondi di gerarchia (pensa a pianeta - > area - > station - > rover)
- decifrare la gerarchia degli oggetti dalla stringa del nome del logger (NASA.Mars.Rover) è problematico (i caratteri jolly a volte non sono sufficienti, alcuni nomi potrebbero non essere abbastanza unici).
Sto cercando una buona idea per risolvere questo, senza codice ingombrante, qualcosa di generico