ASP.NET MVC中的约定优于配置同样适用于ASP.NET Web API。关于约定优于配置的概念下面引用了一段维基百科上的解释,更多内容可以直接参见维基百科约定优于配置条目。
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为"products_sold",才需写有关这个名字的配置。
如果您所用工具的约定与你的期待相符,便可省去配置;反之,你可以配置来达到你所期待的方式。
在上一篇文章中,我们测试了HTTP GET请求,那么Controller是根据什么来选择相应的Action的呢?这里就用到了ASP.NET Web API的约定。
ASP.NET Web API约定凡是名称为Get或者以Get开头的Action,比如GetEmployee或GetAllEmployees或GetEmployeeById等都用来处理HTTP GET请求。相应的HTTP POST,PUT,DELETE以此类推。重写这些约定可以使用AcceptVerbs特性或HttpGet,HttpPost,HttpPut,HttpDelete特性等。
下面的代码分别演示两种配置的方法:
[AcceptVerbs("GET")] public Employee RetrieveEmployeeById(int id) { return list.First(e => e.Id == id); } [HttpGet] public Employee RetrieveEmployeeById(int id) { return list.First(e => e.Id == id); }
在我们示例项目中的App_Start/WebApiConfig可以找到Web API 的路由配置:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
如果将routeTemplate改成"webapi/{controller}/{id}",上一篇文章中的HTTP GET请求就应该改成http://localhost:8396/webapi/employees了。
如果需要在路由模板中加入其它变量,比如组织id,则可以配置如下:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{orgid}/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { orgid = @"\d+" } );
相应的访问地址也要改成http://localhost:8396/api/123/employees
在Action中获取组织id,则需要修改相应的Action:
public Employee Get(int orgid, int id) { return list.First(e => e.Id == id); }
本篇参考《Practical ASP.NET Web API》一书的1.3 Choosing Configuration over Convention