[英]ASP.NET Core MVC inject per request
我期待在.Net Core中为每个请求注入RequestContext。 在服务集合中。
有人尝试了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:'尝试激活'CAWP.Api.Controllers.MvcDepency'时,无法解析类型为'Microsoft.AspNetCore.Http.HttpRequest'的服务。
控制器已经可以通过基类访问每个方法中的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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.