gpt4 book ai didi

c# - API Controller 在初始化时创建对象

转载 作者:行者123 更新时间:2023-11-30 15:24:32 24 4
gpt4 key购买 nike

我目前有一个名为 “People” 的 API Controller ,它继承了 ApiController

Controller 中有多个[HttpPost]/[HttpGet] 方法。每个人都使用相同的启动。即:

[HttpPost]
[Route(@"{personID}"]
public async SavePerson(int personID, [FromBody] PersonObject sentPerson) {
// Here is the initialization method that goes and gets a person
// dependent on if they have a record already
var getPerson = _personRepo.GetPerson(personID);
// some code here
}

每个方法都使用存储库中相同的 getPerson 方法。但是,在 MVCControllers 中,您可以调用多个 overrides,例如 OnActionExecuting 等。

有没有办法,在我可以运行的 APIController 初始化时:

var getPerson = _personRepo.GetPerson(personID);

“People” 类中的任何方法运行之前?这意味着我不必为每个新的 Route 重复重写上述方法。

最佳答案

您可以为您的类创建一个 Person 属性和一个设置该属性的 ActionFilter:

Action 过滤器:

public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);

//Add other criterias and required null checkings here

//Find the person id from action arguments
int personID = Convert.ToInt32(actionContext.ActionArguments["personID"]);
var _personRepo = new PersonRepository();

//Get the controller instance that is running and set the Person property
((People)actionContext.ControllerContext.Controller).Person = _personRepo.GetPerson(personID);
}
}

Controller :

[MyActionFilter]
public class ValuesController : ApiController
{
public Person Person { get; set; }

//your actions
}

然后用[MyActionFilter]装饰你的 Controller 或你需要的 Action

然后在任何使用 [MyActionFilter] 修饰的操作中,您可以使用 this.Person

关于c# - API Controller 在初始化时创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715105/

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