Injection de dépendance MVC 6 IUrlHelper

Injection de dépendance MVC 6 IUrlHelper

L'UrlHelper nécessite le contexte d'action actuel, et nous pouvons l'acquérir à partir de l'ActionContextAccessor. J'utilise ceci :

        services.AddScoped<IActionContextAccessor, ActionContextAccessor>();
        services.AddScoped<IUrlHelper>(x =>
        {
            var  actionContext = x.GetService<IActionContextAccessor>().ActionContext;
            return new UrlHelper(actionContext);
        });

Désormais, vous pouvez injecter IUrlHelper directement dans tout ce qui en a besoin sans avoir à passer par IHttpContextAccessor .


Cette méthode est désormais obsolète. Regardez la mise à jour ci-dessous.

Au lieu de services.AddTransient<IUrlHelper, UrlHelper>() ou en essayant d'injecter directement IUrlHelper, vous pouvez injecter IHttpContextAccessor et obtenir le service à partir de là.

public ClassConstructor(IHttpContextAccessor contextAccessor)
{
    this.urlHelper = contextAccessor.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
}

Sauf s'il s'agit simplement d'un bogue, l'ajout du service IUrlHelper avec UrlHelper ne fonctionne pas.

MISE À JOUR 2017-08-28

La méthode précédente ne semble plus fonctionner. Ci-dessous une nouvelle solution.

Configurez IActionContextAccessor en tant que service :

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddSingleton<IActionContextAccessor, ActionContextAccessor>()
        .AddMvc();
}

Injectez ensuite IActionContextAccessor et IUrlHelperFactory pour ensuite générer le IUrlHelper comme ci-dessous

public class MainController : Controller
{
    private IUrlHelperFactory urlHelperFactory { get; }
    private IActionContextAccessor accessor { get; }
    public MainController(IUrlHelperFactory urlHelper, IActionContextAccessor accessor)
    {
        this.urlHelperFactory = urlHelper;
        this.accessor = accessor;
    }

    [HttpGet]
    public IActionResult Index()
    {
        ActionContext context = this.accessor.ActionContext;
        IUrlHelper urlHelper = this.urlHelperFactory.GetUrlHelper(context);
        //Use urlHelper here
        return this.Ok();
    }
}

ASP.NET Core 2.0

Installer

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper

Utiliser

public void ConfigureServices(IServiceCollection services)
{
   ... 
   services.AddUrlHelper();
   ... 
}

Avis de non-responsabilité :auteur de ce package