在 ASP.NET 核心中注入 IUrlHelper

Injection of IUrlHelper in ASP.NET Core

RC1 中,IUrlHelper 可以在服务中注入(services.AddMvc() 在启动时 class)

这在 RC2 中不再有效。有谁知道如何在 RC2 中做到这一点,因为只是更新 UrlHelper 需要一个 ActionContext 对象。不知道如何在控制器之外获取它。

.NET Core 3+ 和 .NET 5 更新(2020 及更高版本)

按照@Dmitry Pavlov 的 中的详细说明使用LinkGenerator。它可以作为 Web 框架的一部分进行注入,并与控制器中已有的 HttpContext 一起使用,或者通过注入 IHttpContextAccessor.

在其他服务中访问。

ASP.NET Core RC2 有一个 issue for this on the github repo。不要注入 IUrlHelper,而是注入 IUrlHelperFactory。听起来您还需要注入 IActionContextAccessor,因为 Controller 不再具有 public 属性 ActionContext.

注册依赖:

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

那就靠它了:

public SomeService(IUrlHelperFactory urlHelperFactory,
                   IActionContextAccessor actionContextAccessor)
{
 
    var urlHelper =
        urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}

然后根据需要使用它。

ASP.NET核心2.0

安装

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper

使用

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

免责声明:此包的作者

对于Net Core 2.0

service.AddMvc()

之后添加这个
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
    var actionContext = factory.GetService<IActionContextAccessor>()
                                   .ActionContext;
    return new UrlHelper(actionContext);
});

对于 .Net Core 2.0

services.AddMvc();

services.AddScoped<IUrlHelper>(x =>
{
   var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
   var factory = x.GetRequiredService<IUrlHelperFactory>();
   return factory.GetUrlHelper(actionContext);
});

对于 ASP.Net Core 2.0,您不得注入 IUrlHelper。它可以作为控制器的 属性 使用。 ControllerBase.Url 是一个 IUrlHelper 实例。

对于 ASP.NET Core 3.x 应用程序只需将 IHttpContextAccessorLinkGenerator 注入您的控制器或服务。它们应该已经在 DI.

中可用
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;

namespace Coding-Machine.NET
{
    public class MyService
    {
        private readonly IHttpContextAccessor _accessor;
        private readonly LinkGenerator _generator;

        public MyService(IHttpContextAccessor accessor, LinkGenerator generator)
        {
            _accessor = accessor;
            _generator = generator;
        }

        private string GenerateConfirmEmailLink()
        {
            var callbackLink = _generator.GetUriByPage(_accessor.HttpContext,
                page: "/Account/ConfirmEmail",
                handler: null, 
                values: new {area = "Identity", userId = 123, code = "ASDF1234"});

            return callbackLink;
        }
    }
}

如果您的应用无法解析 IHttpContextAccessor,只需将其添加到 DI:

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