此方法現在已過時。看看下面的更新。
而不是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();
}
}
是否有一個選項可以封裝退出的UrlHelper,例如IUrlWrapper,然後使用包裝器代替? – Spock
我需要urlhelper仍然正確嗎?這將如何不同 – Gekctek
是的我想不出一種你不會避免UrlHelper的方式。從DI角度來看,您需要像我之前提到的那樣創建一個包裝器。 – Spock