Hassan Agmir Hassan Agmir

ASP.NET Core, injecter directement au niveau de la méthode d'action

Hassan Agmir

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

  1. using Microsoft.Extensions.DependencyInjection; est requis pour [FromKeyedServices], même dans un contrôleur MVC.

  2. .NET 8 minimum — l'injection par attribut sur les paramètres d'action est disponible depuis .NET 8 (comme pour le constructeur).

  3. 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/max venant de la query string).

  4. 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));
Subscribe to my Newsletters

Stay updated with the latest programming tips, tricks, and IT insights! Join my community to receive exclusive content on coding best practices.

© Copyright 2025 by Hassan Agmir . Built with ❤ by Me