在ASP.NET Core应用程序中,我们具有常见的BL类,它们都包含在ctor中:Microsoft.Extensions.Logging.ILogger<Foo>
在ASP.NET Core中,ASP.NET的内部基础结构通过LoggerFactory
处理获取ILogger。
现在,我们想在控制台应用程序中重用这些BL类(用于异步作业),我们如何设置AutoFac和Serilog在不存在Microsoft.Extensions.Logging.ILogger<T>
的环境中注入(inject)LoggerFactory
?
最佳答案
Microsoft.Extensions.Logging
(请参阅source)不是ASP.NET Core的一部分,可以独立运行。您需要做的就是注册ILoggerFactory
和ILogger<>
接口(interface)。ILoggerFactory
is used by Logger<T>
实例化实际的记录器。
在控制台应用程序中使用Logging扩展时,建议仍使用IServiceCollection
,因为这允许您使用IServiceCollection
extension 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.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
剩下的就是在构建容器之后或在应用程序启动之前注册记录器类型:var loggerFactory = container.Resolve<ILoggerFactory>();
loggerFactory.AddConsole()
.AddSerilog();
并像往常一样在您的服务中注入(inject)ILogger<MyService>
。