gpt4 book ai didi

c# - WebAPI : Retrieve GET parameter from Controller Constructor

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:35 26 4
gpt4 key购买 nike

对我的 WebAPI 的每次调用都可能(或可能不)包含 GET 参数

/api/SomeControllerFunction?loglevel=(someint)

我可以从 Controller 内部的函数初始化一个 LogCollector:

[HttpGet] 
SomeControllerFunction(int loglevel = 0)
{
LogCollector logger = new LogCollector(loglevel)
}

为了不重复我的话,我想通过将它添加到 BaseController 的构造函数中来将其隐藏在类层次结构中,我的所有 Controller 都应从该构造函数继承:

public class BaseController: ApiController
{
internal LogCollector Logger
BaseController()
{
Logger = new LogCollector(loglevel);
}

但是我怎样才能从构造函数访问 GET 参数呢?

最佳答案

您可以将 LogCollector 直接注入(inject)方法,而不是使用构造函数。如果您确实想使用构造函数,您应该使用 Di/IoC 框架,因为那样会更合适。

在下面的示例中,您可以使用自定义 ActionFilterAttribute 实例,该实例根据传入(可选)日志级别注入(inject) Logger。然后使用操作上的 RouteAttribute 在路由中定义日志级别。 RouteAttribute 还定义了日志级别的默认值,因此在调用该操作时不需要它。

LogInjectorFilterAttribute.cs

public class LogInjectorFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
const string key = "loglevel";
if(actionContext.ControllerContext.RouteData.Values.ContainsKey(key))
{
var loglevel = int.Parse(actionContext.ControllerContext.RouteData.Values[key].ToString());
LogCollector logger = new LogCollector(loglevel);
actionContext.ActionArguments["logger"] = logger;
}
base.OnActionExecuting(actionContext);
}
}

HomeController.cs

[HttpGet]
[Route("api/Home/Get/{loglevel:int=1}")]
[LogInjectorFilter]
public IHttpActionResult Get(LogCollector logger)
{
}

关于c# - WebAPI : Retrieve GET parameter from Controller Constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36474280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com