Зарегистрируйте открытый универсальный регистратор Serilog на заводе.C#

Место общения программистов C#
Ответить
Anonymous
 Зарегистрируйте открытый универсальный регистратор Serilog на заводе.

Сообщение Anonymous »

Можно разрешить регистратор платформы с категорией с помощью идиоматического кода .NET:

Код: Выделить всё

using Microsoft.Extensions.Logging;

public class Foo
{
private readonly ILogger _logger;

public Foo(ILogger logger) =>
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
С Serilog сложнее:

Код: Выделить всё

using Serilog;

public class Foo
{
private readonly ILogger _logger;

public Foo(ILogger logger) =>
_logger = logger?.ForContext() ?? throw new ArgumentNullException(nameof(logger));
}
Легко забыть регистратор?.ForContext(), и это тоже немного неприятно.
Я бы хотел это сделать:

Код: Выделить всё

using Serilog;

public class Foo
{
private readonly ILogger _logger;

public Foo(ILogger logger) =>
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
К сожалению, в настоящее время невозможно зарегистрировать открытый универсальный тип с помощью фабрики.
Поэтому любой вариант этого не будет работать:

Код: Выделить всё

// ILogger`T.cs
using Serilog;
public interface ILogger : ILogger { }

// Program.cs
builder.Services.AddTransient(
typeof(Serilog.ILogger),
sp => sp.GetRequiredService().ForContext()
);
Есть ли какой-нибудь способ сделать это?
(Без отражения, как в нетривиальной системе, ожидается очень большое количество разрешений регистратора в секунду и без статического класса Serilog.Log, поскольку я предпочитаю идиоматический подход .NET.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... ia-factory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»