web-dev-qa-db-fra.com

Comment puis-je utiliser la nouvelle DI pour injecter un ILogger dans une fonction Azure à l'aide de IWebJobsStartup?

J'utilise Azure Function v2. Voici ma fonction qui utilise l'injection de constructeur:

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

Je déclare toutes les dépendances que je veux injecter dans ma fonction Azure dans la classe de démarrage qui dérive de 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>();
        }
   }

La fonction Azure appelle également d'autres services injectés qui dépendent de l'ILogger, tels que IAccountWorkflow:

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

Le problème est que le DI ne parvient pas à trouver d'implémentation ILogger et ne parvient pas à résoudre les services car un ILogger nul est injecté.

Question

Comment configurer l'injection de ILogger dans IWebJobsStartup?

11
Kzrystof

Vous pouvez ajouter

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

sans avoir besoin d'ajouter DI si vous voulez utiliser IloggerFactory

0
almbrmg