用于在初始化

时间:2015-09-22 10:58:23

标签: c# api

我目前有一个名为“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重复上述方法。

1 个答案:

答案 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