Es mejor declarar la interfaz:
interface ILogger
{
public void Log(string message);
}
luego implementar tipo específico de registrador
class FileLogger : ILogger
{
public void Log(string message)
{
//Append to file
}
}
class EmptyLogger : ILogger
{
public void Log(string message)
{
//Do nothing
}
}
e inyectar cuando sea necesario. Inyectará EmptyLogger
en las pruebas. Usar singleton hará que las pruebas sean más difíciles, porque también tendrá que guardar en el archivo en las pruebas. Si desea probar si la clase realiza entradas de registro correctas, puede usar simulacros y definir expectativas.
Acerca de inyección:
public class ClassThatUsesLogger
{
private ILogger Logger { get; set; }
public ClassThatUsesLogger(ILogger logger) { Logger = logger }
}
ClassThatUsesLogger toma FileLogger en el código de producción:
classThatUsesLogger = new ClassThatUsesLogger(new FileLogger());
En las pruebas se tarda EmptyLogger:
classThatUsesLogger = new ClassThatUsesLogger(new EmptyLogger());
Se inyecta diferentes registradores en diferentes escenarios. Hay mejores formas de manejar las inyecciones, pero tendrás que leer un poco.
EDITAR
recuerde que aún puede utilizar Singleton en su código, como otros sugirieron, pero debe ocultar su uso detrás de interfaz para aflojar la dependencia entre una clase y la aplicación específica de la tala.
que no comprendían la parte de inyección. ¿Podrías por favor elaborar? – Nemo
Se hace referencia a una clase que requiere el registrador, pero no crea el registrador, se le ha pasado una durante la construcción de una clase (o más comúnmente a través del constructor) que tiene el registrador * inyectado * en la clase. http://en.wikipedia.org/wiki/Dependency_injection –