4

我想通過依賴注入來使用IUrlHelper,以便能夠使用其功能爲不同的休息端點生成uris。我似乎不知道如何從頭開始創建UrlHelper,因爲它在MVC 6中進行了更改,MVC不會自動在IoC控制器中提供該服務。MVC 6 IUrlHelper依賴注入

該設置是我的控制器將內部模型接入api模型轉換器類並使用IUrlHelper(全部通過Depenedency Injection)。

如果有更好的替代IUrlHelper/UrlHelper,我可以用它來爲我的WebApi動作/控制器生成Uris,我願意提供建議。

+0

是否有一個選項可以封裝退出的UrlHelper,例如IUrlWrapper,然後使用包裝器代替? – Spock

+0

我需要urlhelper仍然正確嗎?這將如何不同 – Gekctek

+0

是的我想不出一種你不會避免UrlHelper的方式。從DI角度來看,您需要像我之前提到的那樣創建一個包裝器。 – Spock

回答

7

此方法現在已過時。看看下面的更新。

而不是services.AddTransient<IUrlHelper, UrlHelper>()或試圖直接注入IUrlHelper你可以注入IHttpContextAccessor並從那裏獲得服務。

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

除非它僅僅是一個bug,添加具有UrlHelper的IUrlHelper服務無法正常工作。

UPDATE 2017年8月28日

以前的方法似乎不再工作。 下面是一個新的解決方案。

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

沒有支持服務的組件Microsoft.AspNetCore.Mvc.IUrlHelper被發現' – tchelidze

+0

@tchelidze這可能不再適用。這是在最初發布之前,現在有aspnet核心2.不知道你使用的是什麼版本 – Gekctek

+0

使用'.net核心1.1' – tchelidze

7

的UrlHelper要求當前操作背景下,我們可以獲取來自ActionContextAccessor。我使用的是這樣的:

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

現在,你可以注入IUrlHelper直接到任何需要它,而無需通過IHttpContextAccessor跳。

+1

這很好,因爲我需要UrlHelper在一個必須注入控制器的服務中,所以它需要在我進入控制器之前發生。好的解決方案 –

1

ASP.NET核2.0

安裝

PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper 

使用

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

免責聲明:本包的作者