我正在为 ASP.Net 设计一个替代 MVC 框架。我对该框架的部分目标是尽可能少地拥有“魔法”。我唯一的反思是将表单、查询字符串等内容绑定到一个普通的 ol' 类(具有一些用于忽略、转换等的可选属性)。因此,我绝对不做类/方法检测。一切都必须非常明确。我已经经历了大约 3 次 API“形状”的迭代。前两个实现了我没有魔法的目标,但它非常冗长且不易阅读......并且控制器通常必须完成 MVC 框架应该做的繁重工作。
所以,现在在第三次迭代中,我非常努力地让它正确。我做的一件有点争议的事情是路由代码。因为一切都是明确的并且不鼓励反射,所以我无法在控制器中搜索某些属性来解析路由。必须在路由级别指定所有内容。在第一次迭代中,这并没有完成,但它使控制器变得非常繁琐和冗长......
现在,我有这个流畅的 API 来指定路由。它已经有点超出了我最初的想象,现在作为一种方式来指定控制器的方法能够做什么以及它应该接受什么。
进入实际代码。实施无关紧要。您真正需要知道的唯一一件事是涉及到很多泛型类型。因此,这里是一些路由的快速示例:
var router=new Router(...);
var blog=router.Controller(() => new BlogController());
blog.Handles("/blog/index").With((ctrl) => ctrl.Index());
blog.Handles("/blog/{id}").With((ctrl,model) => ctrl.View(model["id"])).WhereRouteLike((r) => r["id"].IsInteger()); //model defaults to creating a dictionary from route parameters
blog.Handles("/blog/new").UsingFormModel(() => new BlogPost()).With((ctrl, model) => ctrl.NewPost(model)); //here model would be of type BlogPost. Also, could substitue UsingRouteModel, UsingQueryStringModel, etc
还有一些其他方法可以实现,例如WhereModelIsLike
对模型进行验证的方法。但是,这种“规范”是否属于路由层?路由层应指定哪些限制?什么应该留给控制器来验证?
我是不是让路由层担心太多了?