C# ASP.NET核心MVC按请求注入
我期待着在.NETCore中为每个请求注入RequestContext。在服务集合内部 8年前有人尝试过。 并将其注入启动时的某个位置,如下所示:C# ASP.NET核心MVC按请求注入,c#,unit-testing,.net-core,tdd,moq,C#,Unit Testing,.net Core,Tdd,Moq,我期待着在.NETCore中为每个请求注入RequestContext。在服务集合内部 8年前有人尝试过。 并将其注入启动时的某个位置,如下所示: services.AddTransient<IMvcDepency, MvcDepency>(x => x.???); 当前错误: System.InvalidOperationException:“在尝试激活“CAWP.Api.Controllers.mvcdepence”时,无法解析类型为“Microsoft.AspNetC
services.AddTransient<IMvcDepency, MvcDepency>(x => x.???);
当前错误:
System.InvalidOperationException:“在尝试激活“CAWP.Api.Controllers.mvcdepence”时,无法解析类型为“Microsoft.AspNetCore.Http.HttpRequest”的服务。”控制器已通过基类访问每个方法中的
HttpRequest
对象。但它只有在调用方法后才可用(原因很明显!)。如果您想将其包装在自己的类中,那么可以在OnActionExecuting
覆盖中完成
您可以在OnActionExecuting
中创建一个新的mvcdepence
类,并在代码中引用它。由于控制器是根据请求创建的,所以您应该能够使用类变量来存储引用
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 };
}
}
公共类值控制器:控制器
{
私人独立性;
公共价值控制人()
{
}
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
_Dependence=新的MVCDepence(context.HttpContext.Request);
base.OnActionExecuting(上下文);
}
//获取api/值
[HttpGet]
公共行动结果获取()
{
变量路径=_depency.PathValue;
返回新字符串[]{“PathValue”,path};
}
}
这将导致mvcdepence
类可以访问HttpRequest
对象。
您应该为imvcdependency
接口添加一个工厂类,以避免OnActionExecuting
中的new
,您的意思是这样的吗?
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
}
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 };
}
}