【问题标题】:ASP.NET Core MVC inject per request每个请求的 ASP.NET Core MVC 注入
【发布时间】:2019-02-12 14:37:16
【问题描述】:

我期待在 .Net Core 中为每个请求注入 RequestContext。在服务集合中。

有人尝试了 8 年。前。 ASP.NET MVC inject per request

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:“尝试激活“CAWP.Api.Controllers.MvcDepency”时,无法解析“Microsoft.AspNetCore.Http.HttpRequest”类型的服务。”

【问题讨论】:

标签: c# unit-testing .net-core tdd moq


【解决方案1】:

控制器已经可以通过基类访问每个方法中的HttpRequest 对象。但它只有在调用方法后才可用(原因很明显!)。如果您想将其包装在您自己的类中,则可以在 OnActionExecuting 覆盖中进行。

您可以在OnActionExecuting 中创建一个新的MvcDepency 类并在代码中引用它。由于控制器是根据请求创建的,因此您应该能够使用类变量来存储引用。

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 接口添加一个工厂类,以避免OnActionExecuting 中的new

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多