log4net - tira il mio singleton, usa LogImpl, etC?

1

Ripubblicare qui ... speriamo che il posto migliore per cercare opinioni in merito. :)

Scrivendo la mia classe wrapper log4net usando C #. Voglio creare una libreria in modo tale che possa farvi riferimento da qualsiasi progetto / assieme in una determinata soluzione con il minimo sforzo. vale a dire: includere il riferimento, magari inserire un'istruzione using e quindi effettuare chiamate come MyLogger.Debug (blahblah); con forse una proprietà (MyLogger) impostata da un metodo "main" da qualche parte.

Dalla lettura dei documenti, non sono sicuro se dovrei scrivere da solo o utilizzare LogImpl? Quest'ultimo sembra includere tutto ciò che vorrei mettere nel mio involucro, quindi, perché reinventare la ruota? Ma c'è anche una nota nella guida che dice che un membro di istanza di tipo logimpl non è thread-safe mentre un membro statico è ...

OTOH, se faccio il mio, guarderei una classe singleton che posso creare una sola volta e usare tutta la mia soluzione (passando il singleton ref agli oggetti che lo richiedono) ma devo riscrivere tutti quei Debug, Error , ecc. sezioni.

Quindi ... non so quale approccio adottare. Cosa vorresti suggerire la gente all'inizio?

    
posta Jon 31.03.2014 - 20:48
fonte

1 risposta

2

Generalmente i singleton sono considerati non validi :

...if you still feel the need to use Singleton objects, consider using the Factory Method pattern instead. It gives you all of the flexibility of the Singleton, with nowhere near as many problems.

... e dovresti iniettare l'implementazione del logger in qualsiasi classe che la usa (o iniettare una fabbrica di logger se vuoi che l'oggetto logger esista finché dura la tua classe), quindi:

interface IMyLogger
{
    void Log(string whatever);
}

class MyClass
{
    private readonly IMyLogger logger;

    public(IMyLogger logger)
    {
        if(logger == null) throw new ArgumentNullException("logger");
        this.logger = logger;
    }

    void someOtherMethod()
    {
        this.logger.Log("Something");
    }
}

Ciò consente di iniettare varie implementazioni del registratore. Se decidi di utilizzare il percorso di scelta rapida e utilizzare un Singleton e quindi utilizzare quello integrato da log4net, accoppierà praticamente ogni classe che lo utilizza direttamente all'implementazione, che in genere è una cattiva idea.

    
risposta data 31.03.2014 - 21:07
fonte

Leggi altre domande sui tag