繁体   English   中英

如何使用新的 DI 将 ILogger 注入使用 IWebJobsStartup 的 Azure 函数?

[英]How can I use the new DI to inject an ILogger into an Azure Function using IWebJobsStartup?

我正在使用Azure Function v2。 这是我使用构造函数注入的函数:

public sealed class FindAccountFunction
{
    private readonly IAccountWorkflow m_accountWorkflow;

    private readonly IMapper m_mapper;

    private readonly ILogger m_logger;

    public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
    {
        m_logger = logger;
        m_mapper = mapper;
        m_accountWorkflow = accountWorkflow;
    }

    [FunctionName("FindAccount")]
    public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
    {
        // Do stuff.
    }
}

我在派生自IWebJobsStartup的 Startup 类中声明了我想要注入到我的 Azure 函数中的所有依赖IWebJobsStartup

    public sealed class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder webJobsBuilder)
        {
            //  Registers the application settings' class.
            webJobsBuilder.Services.AddSingleton<IApplicationSettings, ApplicationSettings>();

            //  ** Registers the ILogger instance **
            //  ** ?? **

            //  Registers the IMapper instance for the contracts.
            var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new MyProfile()));

     webJobsBuilder.Services.AddSingleton(mapperConfiguration.CreateMapper());

            // Registers custom services.
            webJobsBuilder.Services.AddTransient<IStorageService, StorageService>();

            webJobsBuilder.Services.AddTransient<IAccountWorkflow, AccountWorkflow>();
        }
   }

Azure 函数调用其他依赖于 ILogger 的注入服务,例如IAccountWorkflow

public sealed class AccountWorkflow : IAccountWorkflow
{  
    public AccountWorkflow(ILogger logger, IStorageService storageService)
    {
        if(logger is null)
            throw new ArgumentNullException();
    }
}

问题是 DI 无法找到任何ILogger实现并且无法解析服务,因为注入了空ILogger

如何在IWebJobsStartup设置ILoggerIWebJobsStartup

更新

参考在 .NET Azure Functions 中使用依赖项注入

注册服务

要注册服务,您可以创建一个配置方法并将组件添加到IFunctionsHostBuilder实例。 Azure Functions 主机创建一个IFunctionsHostBuilder并将其直接传递到你配置的方法中。

要注册您的 configure 方法,您必须添加一个程序集属性,该属性使用FunctionsStartup属性指定您的 configure 方法的类型。

所以在这种情况下

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]    
namespace MyNamespace {
    public class Startup : FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            //  ** Registers the ILogger instance **
            builder.Services.AddLogging();

            //  Registers the application settings' class.
            //...

            //...omitted for brevity    
        }
    }
}

原来的

我相信由于您可以访问服务集合,因此您应该能够向其中添加日志记录

public void Configure(IWebJobsBuilder webJobsBuilder) {       

    //  ** Registers the ILogger instance **
    webJobsBuilder.Services.AddLogging();

    //OR
    //webJobsBuilder.Services.AddLogging(builder => {
    //    //...
    //});

    //  Registers the application settings' class.
    //...

    //...removed for brevity
}

并且在函数的构造函数中有一个ILoggerFactory

//...

//Ctor
public FindAccountFunction(ILoggerFactory loggerFactory, IMapper mapper, IAccountWorkflow accountWorkflow) {
    m_logger = loggerFactory.CreateLogger<FindAccountFunction>();
    m_mapper = mapper;
    m_accountWorkflow = accountWorkflow;
}

//...

您应该从启动类中删除AddLogging方法的调用。 默认记录器已由 azure 函数主机设置。

[assembly: WebJobsStartup(typeof(StartUp))]
public class StartUp : IWebJobsStartup
{
    public void Configure(IWebJobsBuilder builder)
    {
        builder.Services.AddSingleton<AppSettings>();

        builder.Services.AddTransient<IMyService, MyService>();
    }
}

public MyFunction(IMyService service, ILogger<IMyService> logger)
{
    this.service = service;
    this.logger = logger;
}

Azure Functions Runtime 2.0.12265开始,azure 函数现在支持实例方法

在此处输入图片说明

我设法解决了这个问题:

注入我的班级如下:

我的类.cs:

public class MyClass
{
    private readonly ILogger<MyClass> _logger;

    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }
}

启动.cs:

[assembly: FunctionsStartup(typeof(Namespace.Startup))]   

namespace Namespace {    
public class Startup : FunctionsStartup 
{
    public override void Configure(IFunctionsHostBuilder builder) 
    {
        builder.Services.AddLogging(); 
    }
  }
}

除了在函数 Startup 类中注册类之外,我们还需要在host.json文件中添加命名空间,以便将消息记录到应用洞察中。 如果我们不添加它,它只会将消息记录到本地控制台,但是当部署在 azure 上时,它不会记录任何内容,也不会给出任何错误。

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "FunctionProjectNameSpace.RegisteredClass": "Information"
    }
  }
}

此处的示例代码供参考 - https://gist.github.com/nareshnagpal06/82c6b4df2a987087425c32adb58312c2

你可以加

  "logging": {
    "fileLoggingMode": "debugOnly",
    "logLevel": {
      "default": "Information"
    }
  }

如果您想使用 IloggerFactory,则无需添加 DI

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM