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
Другие вопросы по тегам