정의
3 개의 인터페이스 : ILogger
, ILoggerProvider
및 ILoggerFactory
. 그들의 책임을 알아보기 위해 소스 코드 를 살펴 보겠습니다 .
ILogger : 주어진 로그 레벨 의 로그 메시지를 작성합니다 .
ILoggerProvider : 인스턴스 생성을 담당합니다 ILogger
( ILoggerProvider
로거 생성에 직접 사용해서는 안 됨 ).
ILoggerFactory : ILoggerProvider
팩토리에 하나 이상의를 등록 할 수 있으며 , 이는 차례로 모든를 사용하여 ILogger
. ILoggerFactory
컬렉션을 보유하고 있습니다 ILoggerProviders
.
아래 예에서는 2 개의 공급자 (콘솔 및 파일)를 공장에 등록하고 있습니다. 로거를 만들 때 팩토리는이 두 공급자를 모두 사용하여 로거 인스턴스를 만듭니다.
ILoggerFactory factory = new LoggerFactory().AddConsole(); // add console provider
factory.AddProvider(new LoggerFileProvider("c:\\log.txt")); // add file provider
Logger logger = factory.CreateLogger(); // <-- creates a console logger and a file logger
따라서 로거 자체는 ILogger
s 모음을 유지 하고 로그 메시지를 모두에 기록합니다. 로거 소스 코드를 보면 우리가 확인 할 수 Logger
의 배열이 ILoggers
(즉 LoggerInformation[]
)하고, 동시에 구현되는 ILogger
인터페이스를.
의존성 주입
MS 문서 는 로거를 주입하는 두 가지 방법을 제공합니다.
1. 공장 주입 :
public TodoController(ITodoRepository todoRepository, ILoggerFactory logger)
{
_todoRepository = todoRepository;
_logger = logger.CreateLogger("TodoApi.Controllers.TodoController");
}
Category = TodoApi.Controllers.TodoController로 로거를 생성합니다 .
2. 제네릭 주입 ILogger<T>
:
public TodoController(ITodoRepository todoRepository, ILogger<TodoController> logger)
{
_todoRepository = todoRepository;
_logger = logger;
}
TodoController의 Category = 정규화 된 유형 이름으로 로거를 생성합니다.
제 생각에 문서를 혼란스럽게 만드는 것은 비 제네릭을 주입하는 것에 대해 아무것도 언급하지 않는다는 것 ILogger
입니다. 위의 동일한 예에서 우리는 비 제네릭을 주입 ITodoRepository
하고 있지만 .NET에 대해 동일한 작업을 수행하지 않는 이유를 설명하지 않습니다 ILogger
.
Mark Seemann 에 따르면 :
주입 생성자는 종속성을받는 것 이상을 수행해서는 안됩니다.
컨트롤러에 공장을 주입하는 것은 로거를 초기화하는 (SRP 위반) 컨트롤러의 책임이 아니기 때문에 좋은 접근 방식이 아닙니다. 동시에 제네릭을 주입하면 ILogger<T>
불필요한 노이즈가 추가됩니다. 자세한 내용은 Simple Injector의 블로그를 참조하십시오. ASP.NET Core DI 추상화에 어떤 문제가 있습니까?
주입해야하는 것은 (적어도 위의 기사에 따라) 일반 ILogger
이 아니지만 Microsoft의 내장 DI 컨테이너가 할 수있는 작업이 아니므로 타사 DI 라이브러리를 사용해야합니다. 이 두 문서는 .NET Core에서 타사 라이브러리를 사용하는 방법을 설명합니다.
이것은 Nikola Malovic의 또 다른 기사 로 IoC의 5 가지 법칙을 설명합니다.
니콜라의 IoC 제 4 법칙
확인되는 클래스의 모든 생성자는 자체 종속성 집합을 수락하는 것 외에 다른 구현을 가져서는 안됩니다.