Sto lavorando per aggiungere la registrazione a un progetto utilizzando Windsor Logging Facility e l'integrazione di NLog.Windsor Logging Facility: nome registro di controllo
Piuttosto che seguire la pratica consigliata dalla documentazione di Windsor di aggiungere una proprietà Log
a ogni classe per cui desidero supportare la registrazione, ho deciso di provare a utilizzare la modalità di intercettazione dinamica per farlo. Finora l'intercettore è abbastanza di base; solo utilizza l'iniezione di costruzione per ottenere un'istanza di ILogger
:
class LoggingInterceptor : IInterceptor
{
private readonly ILogger _logger;
public LoggingInterceptor(ILogger logger)
{
if (logger == null) throw new ArgumentNullException("logger");
_logger = logger;
}
public void Intercept(IInvocation invocation)
{
// just a placeholder implementation, I'm not actually planning to do this ;)
_logger.Info(invocation.Method.Name);
invocation.Proceed();
}
}
di là di questo, tutto quello che ho fatto è il minimo per la registrazione del intercettore e la sua applicazione a un componente, e la funzione di registrazione si prende cura di tutto il resto .
container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient);
container.Register(
Component.For<IEmployeeRepository>()
.ImplementedBy<EmployeeRepository>()
.Interceptors(InterceptorReference.ForType<LoggingInterceptor>()).First);
Fin qui tutto bene, una specie di. Il logger che ottengo segue la pratica raccomandata da NLog di un logger per classe. Non penso che sia una buona scelta in questo caso. Significa che ogni singolo messaggio sta per un log denominato "MyApplication.Interceptors.LoggingInterceptor", che non è terribilmente utile.
Preferirei avere i log chiamati dopo l'astrazione a cui è stato applicato il logger. Ad esempio, se il logger è stato applicato a un'implementazione di IEmployeeRepository
, il registro deve essere denominato EmployeeRepository
. È fattibile?
Edit: Ho provato l'attuazione di un personalizzato ILoggerFactory
e istruire il contenitore per usarlo al posto. Tuttavia, ho colpito rapidamente un posto di blocco: quando Windsor chiama in fabbrica, l'unica informazione fornita è il tipo di oggetto per il quale viene acquisito il logger. Non sono fornite altre informazioni sull'oggetto, quindi lo ILoggerFactory
non ha modo di scoprire l'astrazione a cui è stato applicato l'intercettore.
Ho notato che ci sono due sovraccarichi di ILoggerFactory.Create()
che accettano stringhe come argomenti. Windsor non sembra utilizzare nessuno dei due direttamente, ma si presume che debbano essere lì per un motivo. C'è qualcosa nella fluente API di registrazione che può essere usata per specificare che una stringa particolare debba essere usata?
Il tuo Google-fu è chiaramente migliore del mio. Questo dovrebbe essere perfetto: l'unico dettaglio in più è ottenere un log chiamato per il tipo astratto piuttosto che il tipo concreto.Sto pensando che lo farò cercando le interfacce del tipo concreto per quelle che seguono una convenzione. –
Sono contento di essere stato in grado di aiutare! – wageoghe