4

Я хочу использовать IUrlHelper через инъекцию зависимости, чтобы иметь возможность использовать ее функциональные возможности для генерации uris для разных конечных точек отдыха. Я не могу понять, как создать UrlHelper с нуля, потому что он изменился в MVC 6 и MVC автоматически не имеет эту услугу, доступную в контроллере IoC.MVC 6 Инъекция зависимостей IUrlHelper

Установка - мой контроллер принимает внутреннюю модель в класс преобразователя модели api и использует IUrlHelper (через Injection Dependency Injection).

Если есть лучшая альтернатива IUrlHelper/UrlHelper, я могу использовать для генерации Uris для моего действия/контроллеров WebApi. Я открыт для предложения.

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

Если это не просто ошибка, добавив сервис IUrlHelper с UrlHelper не работает. не

UPDATE 2017-08-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 core 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(); 
    ... 
} 

Отказ: автор этого пакета