簡體   English   中英

每個請求的ASP.NET Core MVC注入

[英]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接口添加一個工廠類,以避免OnActionExecutingnew

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM