Относительно использования регистрации в любом компоненте:
Вы только что пропустили AddTransient.
Вот полный пример, который работал для меня.
Добавление регистрации в компонент вВаше заявление выполняется путем запроса либо ILoggerFactory
, либо ILogger<T>
через инъекцию зависимостей.Если запрашивается ILoggerFactory
, должен быть создан регистратор, используя его метод CreateLogger
.
Если ваш CustomClass
является контейнером данных (класс DTO), он не должен знать о ведении журнала,но просто содержат данные.
Для других классов с именами, такими как «Служба», «Поставщик», «Обработчик» и т. д., лучшая практика - разрешать экземпляры с помощью внедрения зависимостей.В общем, вы должны использовать DI везде, где это возможно, так как это метод для достижения слабой связи между объектами и их соавторами или зависимостями.Для получения дополнительной информации может быть интересен следующий вопрос: Должен ли я использовать Dependency Injection или статические фабрики?
Поэтому просто добавьте ILogger<CustomClass>
в его конструктор (фактически так же, как вы делаетедля контроллеров), поскольку .NET Core по умолчанию поддерживает только внедрение конструктора:
public class CustomClass
{
private readonly ILogger _logger;
public CustomClass(ILogger<CustomClass> logger)
{
_logger = logger;
}
}
Встроенный контейнер внедрения зависимостей ASP.NET Core автоматически разрешает переходные зависимости.Поэтому, если ваш контроллер имеет класс A
в качестве зависимости, которая использует класс B
, где вы хотите что-то регистрировать, ваш код может выглядеть примерно так:
public class MyController
{
public MyController(ClassA classA)
{ ... }
}
public class ClassA
{
public ClassA(ClassB classB)
{ ... }
}
public class ClassB
{
private readonly ILogger _logger;
public ClassB(ILogger<ClassB> logger)
{
_logger = logger;
}
public void DoSomethingWithLogging()
{
// use _logger
}
}
Обратите внимание, что вам также необходимо зарегистрироватьзависимости в Startup
с использованием IServiceCollection.Add…
методов:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddTransient<ClassB>();
services.AddTransient<ClassA>();
}
Встроенная поддержка ведения журнала означает, что .NET Core из коробки знает о встроенных абстракциях и использует их для ведения журнала.Это в основном выполняется с помощью интерфейсов ILoggerFactory
и ILoggerProvider
.
/// <summary>
/// Represents a type used to configure the logging system and create instances of <see cref="ILogger"/> from
/// the registered <see cref="ILoggerProvider"/>s.
/// </summary>
public interface ILoggerFactory : IDisposable
// <summary>
/// Represents a type that can create instances of <see cref="ILogger"/>.
/// </summary>
public interface ILoggerProvider : IDisposable
Используя собственную реализацию ILoggerProvider
, вы можете добавить свой собственный регистратор, который может делать все, что вы захотите.В качестве рабочего примера вы можете проверить реализацию регистратора NLog .
А благодаря ILoggerFactory
вы можете просто настроить регистратор для конкретных проектов:
Чтобы настроить ведение журнала в приложении ASP.NET Core, необходимо разрешить ILoggerFactory
в методе Configure
вашего класса Startup
.ASP.NET Core автоматически предоставит экземпляр ILoggerFactory
с использованием внедрения зависимостей, когда вы добавите параметр этого типа в метод Configure
.