Serilog permette la creazione di un contesto consapevole logger:di Serilog ILogger iniettato usando Log.ForContext <T>, dove T è il consumatore
Log.ForContext<T>()
vorrei registro Serilog con SimpleInjector in modo tale che è T
il tipo di consumatore, cioè è a quale classe è iniettato.
ad es.
public class Car
{
public Car(ILogger logger) <= would be injected using Log.ForContext<Car>()
{
}
}
posso vedere questo has been done with AutoFac.
E guardando attraverso il SimpleInjector documentation, c'è un sovraccarico molto promettente di RegisterConditional()
(con il parametro Func<TypeFactoryContext, Type>
).
c.RegisterConditional(typeof (ILogger),
x => Log.ForContext(x.Consumer.ImplementationType), <= won't compile as expecting a Type
Lifestyle.Scoped,
x => true);
però, non voglio dire SimpleInjector che Tipo costruire, ma come costruire uno.
Abbiamo esplicitamente lasciato fuori la possibilità di registrare un delegato con il metodo 'RegisterConditional', perché ciò consentirebbe di prendere decisioni di runtime durante la creazione del grafo di oggetti, e non consente a Simple Injector di eseguire analisi approfondite sui grafici degli oggetti. Quindi questo trucco è quello di racchiudere la chiamata 'Log.ForContext' all'interno di una classe generica definita automaticamente, che è esattamente ciò che consiglia @janhartmann. Che tu nasconda o meno Serilog dietro la tua astrazione dipende da te, ma io assolutamente consiglio di farlo. Quindi per me, la risposta di Jan è * la * risposta corretta. –
Steven
Assicurati anche di non registrare troppo: https://stackoverflow.com/a/9915056/264697 – Steven