2017-01-01 29 views
1

我們有一個ASP.NET應用程序的核心在構造函數是得到普遍BL類:如何使用Serilog和AutoFac在控制檯應用程序中獲取Microsoft.Extensions.Logging <T>?

Microsoft.Extensions.Logging.ILogger<Foo>

在ASP.NET核心,ASP.NET的內部基礎架構處理通過LoggerFactory得到ILogger。

我們現在想重新使用一個控制檯應用程序,這些BL類(異步作業),我們如何建立AutoFac和Serilog注入Microsoft.Extensions.Logging.ILogger<T>在環境LoggerFactory不存在?

+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 Core的一部分,可以獨立運行。您只需註冊ILoggerFactoryILogger<>接口即可。

ILoggerFactoryis used byLogger<T>來實例化實際的記錄器。

在控制檯應用程序中使用日誌記錄擴展時,建議仍使用IServiceCollection,因爲這允許您使用IServiceCollectionextension methods來註冊支持此模式的所有程序包。

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.DependencyInjection集成支持庫註冊。

但是當然您也可以手動註冊它,但是當Microsoft.Extensions.Logging庫(添加了新的依賴項)發生更改時,您將無法獲得它,並且首先必須弄清楚或挖掘into the source code才能找到該錯誤。

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

剩下的工作就是在容器已建成或在應用程序啓動之前,之後註冊記錄類型:

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

,並在您的服務注入ILogger<MyService>如常。

+3

通用記錄器需要使用Autofac註冊爲'builder.RegisterGeneric(typeof(Logger <>))。As(typeof(ILogger <>))。SingleInstance();' – Ruskin

相關問題