Injection of IUrlHelper in ASP.NET Core
For ASP.NET Core 3.x app just inject IHttpContextAccessor
and LinkGenerator
to your controller or service. They should be already available in 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;
}
}
}
If your app can't resolve IHttpContextAccessor
just add this to DI
:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
}
.NET Core 3+ and .NET 5 Update (2020 and later)
Use LinkGenerator
as detailed in @Dmitry Pavlov's answer on this thread. It's injectable as part of the web framework, and works with the HttpContext
already available in controllers, or accessible in other services by injecting the IHttpContextAccessor
.
For ASP.NET Core RC2 there is an issue for this on the github repo. Instead of injecting the IUrlHelper
, take an IUrlHelperFactory
. It also sounds like you'd need the IActionContextAccessor
injected as a Controller
no longer has a public property ActionContext
.
Register the dependency:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
Then depend on it:
public SomeService(IUrlHelperFactory urlHelperFactory,
IActionContextAccessor actionContextAccessor)
{
var urlHelper =
urlHelperFactory.GetUrlHelper(actionContextAccessor.ActionContext);
}
Then use it as you see fit.
For Net Core 2.0
Add this after service.AddMvc()
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});