MVC 6 IUrlHelper 依赖注入

MVC 6 IUrlHelper Dependency Injection

我想通过依赖项注入使用 IUrlHelper,以便能够使用其功能为不同的 rest 端点生成 uris。我似乎无法弄清楚如何从头开始创建 UrlHelper,因为它在 MVC 6 中发生了变化,并且 MVC 不会自动在 IoC 控制器中提供该服务。

设置是我的控制器采用内部模型到 api 模型转换器 class 并使用 IUrlHelper(全部通过依赖注入)。

如果有比 IUrlHelper/UrlHelper 更好的替代方法,我可以用来为我的 WebApi 生成 Uris action/controllers 我愿意接受建议。

此方法现已过时。看下面的更新。

您可以注入 IHttpContextAccessor 并从那里获取服务,而不是 services.AddTransient<IUrlHelper, UrlHelper>() 或尝试直接注入 IUrlHelper。

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

除非是bug,否则用UrlHelper 添加IUrlHelper 服务是行不通的。

更新 2017-08-28

之前的方法好像不行了。 下面是一个新的解决方案。

将 IActionContextAccessor 配置为服务:

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

然后注入 IActionContextAccessor 和 IUrlHelperFactory 生成如下所示的 IUrlHelper

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();
    }
}

UrlHelper 需要当前的操作上下文,我们可以从 ActionContextAccessor 获取它。我正在使用这个:

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

现在,您可以将 IUrlHelper 直接注入到任何需要它的地方,而无需跳过 IHttpContextAccessor 。

ASP.NET核心2.0

安装

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper

使用

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

免责声明:此包的作者

适用于 .NET 核心 3.1

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
                .AddScoped(x =>
                    x.GetRequiredService<IUrlHelperFactory>()
                        .GetUrlHelper(x.GetRequiredService<IActionContextAccessor>().ActionContext)); //Inject UrlHelp for