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
?
Vous pouvez ajouter
"logging": {
"fileLoggingMode": "debugOnly",
"logLevel": {
"default": "Information"
}
}
sans avoir besoin d'ajouter DI si vous voulez utiliser IloggerFactory