2017-01-01 5 views
1

우리는의 ctor에서 얻을 ASP.NET 핵심 응용 프로그램에서 일반적으로 BL 클래스가 있습니다.Serilog 및 AutoFac을 사용하여 콘솔 응용 프로그램에서 Microsoft.Extensions.Logging <T>을 얻는 방법? ASP.NET 코어에서</p> <p><code>Microsoft.Extensions.Logging.ILogger<Foo></code></p> <p>, ASP.NET의 내부 인프라가 <code>LoggerFactory</code> 통해하는 ILogger를 받고 처리합니다

우리는 지금 (비동기 작업에 대한) 콘솔 응용 프로그램에서 이러한 BL 클래스를 재사용 할

, 우리는 어떻게 설정 AutoFac 및 Serilog LoggerFactory이 존재하지 않는 환경에서 Microsoft.Extensions.Logging.ILogger<T>을 주입합니까?

+0

"LoggerFactory가 존재하지 않는 환경"이란 무엇을 의미합니까? LoggerFactory는 ASP.NET Core의 일부가 아니며 Microsoft.Extensions.Logging 패키지의 일부입니다. https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging/LoggerFactory.cs – Tseng

답변

12

Microsoft.Extensions.Logging (source 참조)은 ASP.NET 코어의 일부가 아니며 독립적으로 실행할 수 있습니다. 당신이해야 할 일은 ILoggerFactoryILogger<> 인터페이스를 등록하는 것입니다.

ILoggerFactoryis used byLogger<T> 실제 로거를 인스턴스화합니다.

콘솔 응용 프로그램에서 로깅 확장을 사용하는 경우 IServiceCollection을 계속 사용하는 것이 좋습니다. IServiceCollectionextension methods을 사용하면이 패턴을 지원하는 모든 패키지를 등록 할 수 있습니다. 당신이 클래스 Microsoft.Extensions.DependencyInjection 통합 지원 기능이있는 라이브러리에 등록 할 필요가 구체적으로 생각하지 않습니다으로

var services = new ServiceCollection(); 
services.AddLogging(); 

// Initialize Autofac 
var builder = new ContainerBuilder(); 
// Use the Populate method to register services which were registered 
// to IServiceCollection 
builder.Populate(services); 

// Build the final container 
IContainer container = builder.Build(); 

은 권장되는 방법입니다.

물론 수동으로 등록 할 수도 있지만 Microsoft.Extensions.Logging 라이브러리 (새 종속성이 추가됨)가 변경되면 얻을 수 없으며 먼저 오류를 찾기 위해 into the source code을 알아 내거나 찾아야합니다.

var loggerFactory = container.Resolve<ILoggerFactory>(); 
loggerFactory.AddConsole() 
    .AddSerilog(); 

및 서비스

은 평소와 같이 ILogger<MyService>를 주입 : 남아있는 모두

builder.RegisterType<LoggerFactory>() 
    .As<ILoggerFactory>() 
    .SingleInstance(); 
builder.RegisterType(typeof(Logger<>)) 
    .As(typeof(ILogger<>)) 
    .SingleInstance(); 

는 컨테이너가 내장 또는 응용 프로그램이 시작하기 전에 한 후 로거 유형을 등록하는 것입니다.

+3

Generic logger는 Autofac을 사용하여 builder.RegisterGeneric (typeof (Logger <>))로 등록해야합니다. (typeof (ILogger <>)). SingleInstance();' – Ruskin