2011-11-08 11 views
5

Ho una libreria di classi in C# e fa molte funzioni diverse per me. Voglio essere in grado di accedere a tutta la classe, tuttavia, davvero non voglio dover passare le istanze della libreria di logging.La registrazione in tutta la libreria di classi senza riferimenti passa

ad es.

Ho classi ovunque in questa libreria e sto lottando con un buon modo per farlo. Ho osservato un'iniezione di dipendenza con Ninject, ma non riesco a capire come dovrebbe funzionare.

Quindi, per riassumere, voglio essere in grado di avere una classe di registrazione, ed essere in grado di istanziarlo una volta, quindi usarlo ovunque per accedere.

risposta

5

Non vedo il bisogno di un singleton. Basta usare una classe statica nella libreria:

internal static class Logger { 

static Logger() { 

    // configure logger 

} 

internal static void Log(string Message, params object[] args) { 

    var message = string.Format(Message, args); 
    // write message 

} 
+1

NOTA: il secondo parametro nella firma per 'Log' ha un errore di battitura. La parola chiave è 'params' piuttosto che' param' e l'intera riga dovrebbe leggere: 'void statico interno Log (string Message, params object [] args) {' –

+0

Grazie @DavidTansey: corretto – IAbstract

+0

@IAbstract Come condividerei un comune effettuare il log tra il codice che chiama la libreria di classi e la libreria di classi stessa? – Howiecamp

0

È possibile utilizzare uno singleton per il proprio registratore e chiamarlo come da qualsiasi luogo.

+1

Penso che Singleton sia una cattiva forma e non giustificata in questo caso. – IAbstract

+0

Penso che potresti spiegarlo. – CodeCaster

+0

I singleton non dovrebbero essere una prima considerazione per qualsiasi soluzione. Se per prima cosa pensi * "Singleton potrebbe funzionare qui" *, dovresti semplicemente usare una classe statica. Se, tuttavia, si determina che la classe statica richiede uno stato o si deve implementare un'interfaccia, ** allora ** si consideri un singleton. Molto spesso, le classi statiche saranno sufficienti. – IAbstract

1

mia preferenza sarebbe metodi di estensione che implementano una certa classe statica come detto da @IAbstract. Se le vostre classi tutti implementano la propria interfaccia ILOG si potesse fare qualcosa di simile:

public static void Log(this ILog source, string message) 
{ 
    source.Log(message, null); 
} 

public static void Log(this ILog source, string message, param object[] args) 
{ 
    // Assuming a static class as mentioned by @IAbstract 
    Logger.Log(message, args); 
} 

Poi nelle classi o da dovunque a seconda dei livelli di protezione si sarebbe in grado di utilizzare this.Log(message) o esternamente myClass.Log(message). Ciò non dovrebbe essere pubblico, ma ciò dipenderebbe dalle esigenze della biblioteca.

Problemi correlati