MVC 6 IUrlHelper Внедрение зависимостей
Я хочу использовать IUrlHelper через внедрение зависимостей, чтобы иметь возможность использовать его функциональность для генерации Uris для разных конечных точек остальных. Я не могу понять, как выяснить, как создать UrlHelper с нуля, потому что он изменился в MVC 6, и MVC автоматически не предоставляет эту службу в контроллере IoC.
Установка - это мой контроллер, получающий внутреннюю модель для преобразования в модель API-интерфейса и использующий IUrlHelper (все через Depenedency Injection).
Если есть лучшая альтернатива IUrlHelper/UrlHelper, я могу использовать ее для генерации Uris для моих действий / контроллеров WebApi, к которым я открыт.
4 ответа
Этот метод сейчас устарел. Посмотрите на обновление ниже.
Вместо services.AddTransient<IUrlHelper, UrlHelper>()
или пытаясь напрямую внедрить IUrlHelper, вы можете внедрить IHttpContextAccessor и получить оттуда сервис.
public ClassConstructor(IHttpContextAccessor contextAccessor)
{
this.urlHelper = contextAccessor.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
}
Если это не просто ошибка, добавление службы IUrlHelper с UrlHelper не работает.
ОБНОВЛЕНИЕ 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 Core 2.0
устанавливать
PM> Install-Package AspNetCore.IServiceCollection.AddIUrlHelper
использование
public void ConfigureServices(IServiceCollection services)
{
...
services.AddUrlHelper();
...
}
Отказ от ответственности: автор этого пакета
ДЛЯ .NET CORE 3.1
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>()
.AddScoped(x =>
x.GetRequiredService<IUrlHelperFactory>()
.GetUrlHelper(x.GetRequiredService<IActionContextAccessor>().ActionContext)); //Inject UrlHelp for