基于任务的UI(Task-Based UI)。服务器端的MVC框架主要问题是粒度太粗,只能适合传统的CRUD简单粗放的应用,当我们的软件系统转向以用户体验为主,而不是以企业自身资源管理为主的模式时,响应式设计必然拥有良好的用户感受,而传统后端MVC固定的框架针对大量客户端并发事件处理无疑是力不从心,想象一下,用户鼠标一移动就可能发出一个事件,这么多事件如果每个都走Model-View-Controller这样一个流程,仅Controller就要编制多少?编程成本极高,维护拓展起来很不方便。将MVC框架移植到浏览器前端(Rich Client),则可以巧妙回避以上问题,javascript的函数风格使得其处理事件来得更简单,对于围绕模型的操作则可以使用MVC实现。见:JavaScript大型可扩展的设计模式,而模型则是从后端领域层以JSON方式推送过来。后端架构是:REST+CQRS,将REST和CQRS组合在一起成为CQREST架构。REST的好处是针对资源进行简单轻量的操作,REST核心两个概念是资源和状态,而我们可以认为这个资源实际就是领域模型,通常是DDD领域驱动设计中的聚合根Aggregate,而状态是则是聚合根的状态,驱动状态变化的是REST的POST/PUT/GET/DELETE四个方法。这样REST和DDD无缝吻合在一起了。再看看REST的四个方法实际也分两种类型:读和写。其中POST/PUT/DELETE属于对领域模型资源进行写操作的命令,属于CQRS的Command路线;而GET属于客户端发出Query查询,属于CQRS的Query读路线。这样REST又和CQRS无缝吻合在一起。我曾经在《没有人真正理解REST or HTTP》http://www.jdon.com/41716中说:将来是否有一种技术思想,将DDD REST以及面向函数三者完美捆绑一起,通过URL代表领域模型类图的结构关系,比如/forum/thread,代表Forum类的子类Thread,领域模型被显式地用URL表达出来,用户访问形式和我们分析设计的模型合二为一,大道至简。而时隔两年的今天已经实现了:《使用Yoga灵活实现REST》http://www.jdon.com/45544如果说DDD的领域模型是核心,那么REST就是核心外的轻量壳,而CQRS则是壳和核心之间的组织,三者如有机体一样天然组合在一起,简单,易用,灵活,可伸缩,易于维护。从缓慢的历史变化中我们应该发现一个主脉方向:MVC + REST + CQRS,如此坚定一路走来,无疑他们代表未来一种即将普及的主流架构风格。参考:J2EE死了 javacript + 后端JSON服务方式胜出 :http://www.jdon.com/44690CQREST英文: http://prezi.com/svfmvrx9dq_x/cqrs-and-rest/使用 Angular.js, Node.js 和 MongoDB开发简单案例:http://www.jdon.com/45599
[该贴被admin于2013-07-20 19:21修改过]
[该贴被jdon007于2013-07-20 21:55修改过]
[该贴被hbbbs于2013-07-21 12:59修改过]
[该贴被admin于2013-07-23 07:34修改过]
[该贴被gameboyLV于2013-07-23 21:31修改过]
客户端MVC+REST这个架构我很赞同,但是REST连接的应该是服务端预渲染的数据结构,而不是CQRS。 <p class="indent">
public class TestController { private static DB db = new DB(); @In private RequestBody body; @Path("/") public Represent index() { return new Html("index"); } @Path("/users") public Represent get() { return Json.create(db.all()); } @Path("post:/users") public Represent add(User user) { db.add(user); return Json.create(new Result(true, "add success")); } @Path("put:/users/:id") public Represent update(int id) { db.update(body.json2Object(User.class)); return Json.create(new Result(true, "update successful")); } @Path("delete:/users/:id") public Represent delete(int id) { db.del(id); return Json.create(db.all()); } @Path("post:/upload") public Represent upload(FormFile formFile) { return Json.create(new Result(true, "upload successful")); } } <p class="indent">
get "/" { render => index } get "/" { "hello world" } <p class="indent">
app.get('/api', function (req, res) { res.send('Our Sample API is up...'); });
[该贴被oojdon于2013-07-25 12:56修改过]
http://www.jdon.com/45619关于本文进一步分析:http://www.jdon.com/45622
[该贴被banq于2013-07-30 17:10修改过]
猜你喜欢
其他人在看