ASP.NET Core-ILoggerFactory的启动类和依赖注入

时间:2018-07-13 19:28:21

标签: asp.net-core-2.0 nlog loggerfactory

我正在使用ASP.NET Core 2.1和NLog。如果我在StartUp中添加一个依赖于ILoggerFactory的构造函数,则它将其解析为与Configure方法中获得的实例不同的实例。在Configure方法中,我调用AddNLog,因为它是一个不同的实例,所以我在ConfigureServices中使用的实例尚未准备好用于NLog。

有什么想法可以在ConfigureService中访问ILoggerFactory并在Configure中具有相同的实例,以便可以调用AddNLog吗?在ConfigureServices中调用AddNLog不起作用。

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题,但是您不能像explained here那样做吗:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
ILoggerFactory loggerFactory)
{
    //...
    loggerFactory.AddLog4Net(); // << Add this line

答案 1 :(得分:0)

我通过在应用程序启动事件中注册一些代码来解决它。

在配置方法中:

            appLifetime.ApplicationStarted.Register(() =>
            {
                InitializeSingletonObjects(app, loggerFactory);
            });

到那时,一切都已正确初始化,您可以在InitializeSingletonObjects中执行任何所需的操作。就我而言,这就是我所做的。

        private void InitializeSingletonObjects(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            // email template processor
            var emailRepository = app.ApplicationServices.GetService<IEmailRepository>();
            IEmailTemplateProcessor emailTemplateProcessor = app.ApplicationServices.GetService<IEmailTemplateProcessor>();
            string containerName = appConfiguration.AzureBlobStorage.BlobStorageContainerEmailTemplates;
            var emailTemplates = emailRepository.GetEmailTemplates(true);

            emailTemplateProcessor.Initialize(containerName, emailTemplates);
        }

有关https://www.khalidabuhakmeh.com/looking-at-asp-net-cores-iapplicationlifetime上IApplicationLifetime的更多信息