ASP.NET Core, injecter directement au niveau de la méthode d'action
En ASP.NET Core, vous pouvez injecter directement au niveau de la méthode d'action avec [FromKeyedServices], sans passer par le constructeur.
Exemple
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Demo.Services;
namespace Demo.Controllers
{
[ApiController]
[Route("clients")]
public class ClientsController : ControllerBase
{
[HttpGet]
public IActionResult List(
[FromKeyedServices("stille")] SageConnectionManager sageManager,
string? search,
int max = 200)
{
var result = ClientServices.List(sageManager, search, max);
return Ok(result);
}
[HttpGet("{codeClient}")]
public IActionResult Show(
[FromKeyedServices("stille")] SageConnectionManager sageManager,
string codeClient)
{
var client = ClientServices.Show(sageManager, codeClient);
return client is null
? NotFound(new { message = $"Client '{codeClient}' introuvable." })
: Ok(client);
}
}
}
Pas de constructeur du tout nécessaire — chaque méthode reçoit son propre SageConnectionManager injecté directement par le framework au moment de l'appel.
Points importants
using Microsoft.Extensions.DependencyInjection;est requis pour[FromKeyedServices], même dans un contrôleur MVC..NET 8 minimum — l'injection par attribut sur les paramètres d'action est disponible depuis .NET 8 (comme pour le constructeur).
L'ordre des paramètres n'a pas d'importance : ASP.NET Core distingue automatiquement les paramètres liés au DI (
[FromKeyedServices],[FromServices]) des paramètres liés à la requête HTTP (route, query string, body) — vous pouvez les mélanger librement comme ci-dessus (sageManager+search/maxvenant de la query string).Différence avec l'injection au constructeur : si plusieurs méthodes du même contrôleur ont besoin du même service, vous devrez répéter
[FromKeyedServices("stille")]sur chacune — le constructeur reste généralement préférable si tout le contrôleur travaille sur la même société. L'injection par méthode est surtout utile quand différentes méthodes du même contrôleur ciblent différentes sociétés :
[HttpGet("stille")]
public IActionResult ListStille([FromKeyedServices("stille")] SageConnectionManager sage)
=> Ok(ClientServices.List(sage, null, 200));
[HttpGet("intercocina")]
public IActionResult ListIntercocina([FromKeyedServices("intercocina")] SageConnectionManager sage)
=> Ok(ClientServices.List(sage, null, 200));