ASP.NET Core MVC внедрить за запрос - PullRequest
0 голосов
/ 07 сентября 2018

Я с нетерпением жду возможности ввести RequestContext для каждого запроса в .Net Core. внутри коллекции услуг.

Кто-то пытался 8 лет. тому назад. ASP.NET MVC инъекция за запрос

public interface IMvcDepency
    {
        string PathValue { get; set; }
    }

public class FakeMvcDepency : IMvcDepency
{
    public string PathValue { get; set; }
}

public class MvcDepency : IMvcDepency
{
    public string PathValue { get; set; }

    public MvcDepency(HttpRequest req)
    {
        PathValue = req.Path.Value;
    }
}

И внедрить его куда-нибудь в автозагрузку следующим образом:

services.AddTransient<IMvcDepency, MvcDepency>(x => x.???);

или в OnActionExecuting, как показано ниже:

public override void OnActionExecuting(ActionExecutingContext actCtx)
    {
        MvcDepency mvcDepency = actCtx.HttpContext.RequestServices.GetService(typeof(IMvcDepency)) as MvcDepency;
        mvcDepency = new MvcDepency(actCtx.HttpContext.Request);
        actCtx.HttpContext.RequestServices.AddService(mvcDepency);// AddService method doesn't in exist
      }

Текущая ошибка: System.InvalidOperationException: «Не удается разрешить службу для типа« Microsoft.AspNetCore.Http.HttpRequest »при попытке активировать« CAWP.Api.Controllers.MvcDepency ». '

1 Ответ

0 голосов
/ 08 сентября 2018

Контроллеры уже имеют доступ к объекту HttpRequest в каждом из методов через базовый класс. Но он доступен только после вызова метода (по понятным причинам!). Если вы хотите обернуть его в свой собственный класс, вы можете сделать это в переопределении OnActionExecuting.

Вы можете создать новый класс MvcDepency в OnActionExecuting и ссылаться на него в коде. Поскольку контроллеры создаются для каждого запроса, вы можете использовать переменную класса для хранения ссылки.

public class ValuesController : Controller
{
    private IMvcDepency _depency;

    public ValuesController()
    {
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        _depency = new MvcDepency(context.HttpContext.Request);

        base.OnActionExecuting(context);
    }

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        var path = _depency.PathValue;

        return new string[] { "PathValue", path };
    }
}

Это должно привести к тому, что класс MvcDepency будет иметь доступ к объекту HttpRequest. Вы должны добавить фабричный класс для вашего IMvcDepency интерфейса, чтобы избежать new в OnActionExecuting.

...