MVC 6 IUrlHelper依赖注入



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

设置是我的Controller接收一个内部模型到api模型转换器类,并使用IUrlHelper(全部通过Depenedency Injection)。

如果有更好的IUrlHelper/UrlHelper替代方案,我可以用来为我的WebApi操作/控制器生成Uri,我愿意接受建议。

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

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

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

这个方法现在已经过时了。查看下面的更新

您可以注入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();
    }
}

ASP.NET Core 2.0

安装

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper

使用

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

免责声明:此包的作者

FOR.NET CORE 3.1

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

相关内容

  • 没有找到相关文章

最新更新