У меня есть настраиваемый целевой класс журнала NLog, который выглядит так:
public class MyTarget : AsyncTaskTarget
{
public MyTarget() {}
public MyTarget(INeedThisThingToFunction thing)
{
Thing = thing;
}
public INeedThisThingToFunction Thing { get; set; }
public override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken cancellationToken)
{
Thing.Use();
return null;
}
}
Я не могу понять, как обеспечить вызов второго конструктора. Я сделал это в Program.cs:
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
ConfigureLogging(host.Services.GetAutofacRoot());
LogManager.GetCurrentClassLogger().Info("Hi mom");
host.Run();
}
private static void ConfigureLogging(IComponentContext container) {
ConfigurationItemFactory.Default.CreateInstance = type =>
{
if (type != typeof(MyTarget) return Activator.CreateInstance(type);
var thing = new ThingTheTargetNeedsToFunction();
return new MyTarget(thing);
}
LogManager.Configuration.Reload();
}
Я пробовал и ряд других вещей, но это ближе всего к чему-то. Когда вызывается LogManager.Configuration.Reload()
, срабатывает код CreateInstance
; но когда срабатывает метод Info
, свойство Thing
цели имеет значение null.
Есть ли лучший способ сделать это? Типа, способ, который работает?
Использование. NET Core 3, NLog, Autofa c.