我目前有一个名为“People”的API控制器,它继承了ApiController
。
控制器中有多个[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
重复上述方法。
答案 0 :(得分:4)
您可以为您的班级创建Person
媒体资源,并为ActionFilter
设置该媒体资源:
<强> ActionFilter:强>
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);
}
}
<强>控制器:强>
[MyActionFilter]
public class ValuesController : ApiController
{
public Person Person { get; set; }
//your actions
}
然后使用[MyActionFilter]
然后,在使用[MyActionFilter]
修饰的任何操作中,您都可以使用this.Person
。