2011-11-08 14 views
5

Tengo una biblioteca de clases en C# y tiene muchas funciones diferentes para mí. Quiero poder iniciar sesión en toda la clase, sin embargo, realmente no quiero tener que pasar instancias de la biblioteca de registro a lo largo.Registro en toda la biblioteca de clases sin referencias pasa

p. Ej.

public void MyMethod(LoggingClass logger) 
{ 
    logger.log("something"); 
} 

public void MyMehtod2(LoggingClass logger) 
{ 
    logger.log("something else"); 
} 

Tengo clases en todas partes de esta biblioteca y estoy luchando con una buena manera de hacerlo. He estado buscando inyección de dependencia con Ninject, pero parece que no puedo entender cómo debería funcionar.

Para resumir, quiero poder tener una clase de registro, y ser capaz de instanciarla una vez, luego usarla en todas partes para iniciar sesión.

Respuesta

5

No veo la necesidad de un singleton. Simplemente use una clase estática en su biblioteca:

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: El segundo parámetro en la firma de 'Log' tiene un error tipográfico. La palabra clave es 'params' en lugar de' param' y toda la línea debe decir: 'static interno static Log (string Message, params object [] args) {' –

+0

Gracias @DavidTansey: corregido – IAbstract

+0

@IAbstract ¿Cómo compartiría un común ¿Entrar entre el código que llama a la biblioteca de clases y la biblioteca de clases en sí? – Howiecamp

0

Se puede usar un singleton para su registrador, y lo llaman como desde donde quieras.

+1

Creo que singleton es mala forma y no está justificado en este caso. – IAbstract

+0

Creo que puedes explicar eso. – CodeCaster

+0

Singletons no debe ser una primera consideración para cualquier solución. Si primero piensa * "singleton podría funcionar aquí" *, simplemente debería usar una clase estática. Sin embargo, si determina que la clase estática requiere un estado o debe implementar alguna interfaz, ** entonces ** considere un singleton. Muy a menudo, las clases estáticas serán suficientes. – IAbstract

1

Mi preferencia serían los métodos de extensión que implementen alguna clase estática como se menciona en @IAbstract. Si sus clases todos poner en práctica su propia interfaz de ILOG que podría hacer que algo como esto:

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); 
} 

Luego, en sus clases o desde cualquier lugar dependiendo de los niveles de protección que sería capaz de usar this.Log(message) o externamente myClass.Log(message). Esto no debería ser público, pero eso dependería de las necesidades de la biblioteca.

Cuestiones relacionadas