在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的一部分,可以独立运行。您需要做的就是注册ILoggerFactoryILogger<>接口(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>

07-28 01:38
查看更多