Iniezione diretta e registro delle dipendenze

1

Diciamo che uso Dependency Injection e non utilizzo un framework DI. Quindi l'iniezione è diretta piuttosto automatica. Come dovrei gestire la classe del logger? Tutti gli oggetti (migliaia) dovrebbero avere un riferimento Logger nei loro costruttori? (Non consideriamo Singletons e Service Locater come nascondono la dipendenza e sono bugiardi patologici.)

    
posta Narek 18.10.2015 - 07:09
fonte

2 risposte

1

How I should handle the logger class?

Dovresti istanziarlo e iniettarlo in qualcosa che ne ha bisogno.

All the objects, (thousands) should have a Logger reference in their constructors?

Quindi cosa? Se quegli oggetti devono registrarsi, allora hanno bisogno di ottenere quella dipendenza da qualche parte .

Direi che avere tali dipendenze pervasive è un odore, anche per la registrazione.

    
risposta data 18.10.2015 - 22:10
fonte
0

In pratica hai due opzioni.

Usa la relazione di composizione

Non si passa una classe implementando un'interfaccia Log a una classe, ma si creerebbe un abstract class in cui, nel suo costruttore, si inizializza direttamente il membro protected Log con l'istanza new della classe implementando l'interfaccia Log .

Tutte le classi che hanno bisogno di usare il logger erediteranno questa classe e se in futuro dovessi cambiare la procedura del meccanismo di registrazione, puoi semplicemente sostituire l' new nella tua base abstract class in un nuovo logger e la modifica verrà propagata in tutte le tue classi.

Utilizza metodi statici

La registrazione è un'attività così semplice, non produce effetti collaterali. Semplicemente apre un flusso da registrare (che si tratti di un database o di un file) e scarica lì il contenuto del registro.

A causa della sua semplicità, il logger può entrare nel pacchetto delle utility.

Tuttavia, c'è un problema. Se decidi in qualsiasi momento, in futuro, di cambiare il modo in cui i processi vengono registrati, dovrai modificare la classe del logger e la sua registrazione metodi. In questo processo è molto probabile che tu perdi il meccanismo di registrazione iniziale o che passi a commentare il codice per le procedure iniziali, il che renderà il tuo codice disordinato.

Dove lavoro, utilizziamo il primo approccio: un'interfaccia di registrazione semplice, contenente metodi come logInfo o logError e le classi implementano l'interfaccia.

Anche se di solito ci tratteniamo dal rapporto di composizione, perché è difficile da deridere, la classe di taglialegna, come ho detto, è così semplice, abbiamo fatto un'eccezione, perché ci piace ancora un po 'più di avere un logger statico.

    
risposta data 18.10.2015 - 21:42
fonte

Leggi altre domande sui tag