c# - 如何使用新的 DI 通过 IWebJobsStartup 将 ILogger 注入(inject)到 Azure 函数中?

标签 c# azure dependency-injection azure-functions

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

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 类中声明要注入(inject)到 Azure Function 中的所有依赖项:

    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 Function 调用其他也依赖于 ILogger 的注入(inject)服务,例如 IAccountWorkflow:

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

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

问题

如何在 IWebJobsStartup 中设置 ILogger 的注入(inject)?

最佳答案

更新

引用Use dependency injection in .NET Azure Functions

Registering services

To register services, you can create a configure method and add components to an IFunctionsHostBuilder instance. The Azure Functions host creates an IFunctionsHostBuilder and passes it directly into your configured method.

To register your configure method, you must add an assembly attribute that specifies the type for your configure method using the FunctionsStartup attribute.

所以在这种情况下

[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
}

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

//...

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

//...

关于c# - 如何使用新的 DI 通过 IWebJobsStartup 将 ILogger 注入(inject)到 Azure 函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54876798/

相关文章:

azure - 项目在 VS 中构建,但不在 Azure Pipeline 中构建,有助于理解错误

dependency-injection - 如何使用 .NET Core 解析类库中的 DI 类?

c# - 正则表达式只允许 .net 中的某些字符

c# - 使用 EPPlus Excel - 如何忽略 excel 错误检查或删除单元格左上角的绿色标记

azure - 无法从azure数据 block 访问cassandra

multithreading - 使用依赖注入(inject)时如何使共享资源线程安全?

c# - 当您没有对容器的引用时,是否可以让 CaSTLe Windsor 解决属性依赖关系?

c# - 在 ASP.NET MVC 应用程序中将逻辑放在哪里,以便每个页面请求始终触发(仅一次)?

c# - 为什么我在 ApplicationUser 中的自定义对象属性为空?

python - Azure功能不使用可用主机实例