前言
以前我都是把 ODataController 和普通 API Controller 分开做. (因为 OData 实在多 Bug, 好东西尽量不要掺和它)
Read 的部分用 OData, CUD 的部分就用原本的 API.
但最近 OData 弃用了 ODataRoute 这些东西, 改用 Web API 的 Route, HttpGet 等.
视乎它有心把大家统一起来, 所以我去了解了一下.
主要参考
Routing in ASP.NET Core OData 8.0 Preview
Attribute Routing in ASP.NET Core OData 8.0 RC
By Default
在没有设置 Attribute 的情况下. 当我们定义一个 Entity 以后. 它就有了它的路径
builder.EntitySet<Product>("Products");
比如
GET products
GET products/$count
GET products/{key}
GET products({key})
这个叫 template, 一般上我们是不会去修改它的. 改了就不像 restful 了嘛.
Controller 要对上这些路径, 就要有一套标准写法
有一点点写不对就匹配不上了
Attribute route
Web API 的 attribute route 可以让我们任意 match url 然后带去 action.
OData attribute route 只是取代了上面那种通过 Controller 命名去 match 的方式.
它并不能任意写 url 哦, 你还是得按照 OData 规定得 restful template 去写匹配
在使用 attribute route 之后, controller, action, parameter 的命名就可以任意了.
但要记得哦, 它不能任意写 path, 一定要写 odata restful template 定义好的, 除非你自己去 override route conversion.
和 WebAPI share 同一个 Controller
我不知道这个是不是一个好的 way 啦. 但至少分开 Controller 对 swagger 会是一个问题啦 (它是以 Controller 分 group 的)
首先不要继承 ODataController
它里面其实也只是有 created 和 updated 的东西而已, 而我刚好只用它做 query. perfect !
没有 ODataController 以后 attribute route 就不 working 了
需要另外加上 [ODataAttributeRouting]
[ODataAttributeRouting] public class HandleCustomerController : Controller { … }
或者
[ODataAttributeRouting] [HttpGet("odata/Orders/{key}")] public IActionResult Get(int key) { return Ok($"Orders{key} from OData"); }
如果只是 action 有, controller 没有, 但是它也会去 parent 拿到 api 哦. 很聪明一下