gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:28:34 26 4
gpt4 key购买 nike

我正在使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com