Serilog позволяет создавать контекстно-зависимые регистратор:ILogger Serilog в впрыскивают с помощью Log.ForContext <T>, где Т потребитель
Log.ForContext<T>()
Я хотел бы зарегистрировать Serilog с SimpleInjector таким образом, что это T
тип потребителя, т. е. какой класс он вводится.
например.
public class Car
{
public Car(ILogger logger) <= would be injected using Log.ForContext<Car>()
{
}
}
Я вижу это has been done with AutoFac.
И, просматривая SimpleInjector documentation, существует очень многообещающая перегрузка RegisterConditional()
(с параметром Func<TypeFactoryContext, Type>
).
c.RegisterConditional(typeof (ILogger),
x => Log.ForContext(x.Consumer.ImplementationType), <= won't compile as expecting a Type
Lifestyle.Scoped,
x => true);
однако, я не хочу сказать SimpleInjector который Тип строить, но как построить один.
Мы явно опущены возможность зарегистрируйте делегат с помощью метода «RegisterConditional», поскольку это позволит принимать решения во время выполнения при создании графа объектов и не позволяет Simple Injector делать глубокий анализ на ваших объектных графах. Итак, этот трюк заключается в том, чтобы обернуть вызов 'Log.ForContext' внутри самоопределяемого общего класса, что и есть то, что советует @janhartmann. Независимо от того, скрываете ли вы Серилог за своей собственной абстракцией, зависит от вас, но я абсолютно согласен с этим. Поэтому для меня ответ Яна - это * правильный ответ. –
Steven
Также убедитесь, что вы не слишком много записываете: https://stackoverflow.com/a/9915056/264697 – Steven