newland.js的Ioc实现
newland.js之所以是框架而不是类库,最重要的原因是它只要几步就能建立起一个网站!换言之,它已经包含了网站从启动到运行的重要流程,至于你还需要什么,是制定还是完善等等不确定的东西,框架已经预留了位置给你填空了。
框架让程序员变成流水线上的工人这一事实是不可逆转的,唯一的区别的有的流水线非常智能,让你过得非常惬意,有的则非常恶心,让你变成苦逼的码畜!
JAVA的三大框架之一,Spring最伟大的举措就是发明了IoC容器。是的,框架帮你做了许多事,但有些文件还是要你去建的,建在指定的目录下;有些代码你还要去写,依照规定好的格式,是建哪个类,继承哪个父类,差一步也不行。框架带来便捷的同时,也带来的枷锁!IoC的目的是让这些痛苦减少些!
首先抄一段话解释什么叫IoC——“在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由容器来完成,然后注入给调用者,因此也称为依赖注入”。
在我的newland.js框架中,最开始的mass.js模块其实只是提供模块加载机制与一些通用方法,不干正事的,它唯一做的有意义的是调用了mvc这个模块。
$.require("system/deploy,system/mvc", function(deploy){deploy( process.cwd() );//监听app目录下文件的变化,实现热启动});
mvc模块的作用是启动服用器,接受请求!在此之前,它会读取配置文件,把用户指定的拦截器与默认拦截器与所有控制器统统读入内存,装配到系统中!
所谓的栏截器其实就是structs那套东西,不认识JAVA的同学如果懂node.js,就去看看connectjs的中间件,差不多就是这个意思,用于处理请求与响应用的工具包。
而控制器是重点,MVC不能没有它。一个控制器有许多功能,因此我们把共用的功能抽取出来构建成基类, 而我们所建的控制器作为子类继承它就可以节约许多代码。
//遍历app/controllers目录下所有控制器模块,并与拦载器模块一起加载它们! $.walk("app/controllers", function(files){$.require( inter.concat( files ), function(){//拦截器放在最前面var intercepters = [].slice.call(arguments,0, inter.length);resource_ready( intercepters )});});
在没有用IoC之前,我们的控制器是这个样子的:
.define("doc_controller",function(){var klass = $.factory({inherit: $.base_controller,index: function(flow){$.log("已进入doc#index action");flow.session.set("xxx","in doc")var view_url = $.path.join("app","views", flow.req.url );flow.fire("get_view", view_url, flow.req.url )}});$.controllers[ "doc"] = new klass });
其实用户要写的就是index,show, edit, destroy这样action方法,其他部分就是死格式!什么指定父类,new实例其实交给系统去处理就行了!因此我们的自定义控制器可以削减成这样子!
$.define("doc_controller",function(){return {index: function(flow){$.log("已进入doc#index action");flow.session.set("xxx","in doc")var view_url = $.path.join("app","views", flow.req.url );flow.fire("get_view", view_url, flow.req.url )}} });
那么子类的创建与继承关系的指定与实例的创建传到mvc.js中去管理:
var rcname = /\/(\w+)_controller/;//遍历app/controllers目录下所有控制器模块,并与拦载器模块一起加载它们!$.walk("app/controllers", function(files){$.require( inter.concat( files ), function(){//取得放在前面的拦截器var intercepters = [].splice.call(arguments, 0, inter.length);//取得放在后面的控制器var controllers = arguments;//进行控制反转,构建我们所需要的控制器子类与它的实例files.forEach(function(el, i){//mac下的路径为 app/controllers/doc_controller.js//window下的路径为 app\\controllers\\doc_controller.jsvar match = el.replace(/\\/g,"/").match(rcname);var controller = controllers[i];controller.inherit = $.base_controllervar klass = $.factory(controller);$.controllers[ match[1] ] = new klass;});resource_ready( intercepters )});});
需要说明一下的是,newland.js分成两大块,app目录下的模块是用户自建的文件或系统指令下建立的模块(下称app模块),system目录下的模块则是辅助app模块运行用的。需要用户动手的app模块越简单就越好!任何复杂的类最好不要用,就算用都交由框架去处理,去new 实例;任何复杂的功能都做用钩子的形式,或通俗地说,是回调函数的形式,交由框架去调度;所有不确定的功能都做成自定义事件形式,由框架或框架的另外加载的模块去fire。诸如此类,所有耦合就松绑了,得以最大限度地适应需求的变化。
http://dotnetfresh.cnblogs.com/archive/2005/06/27/181878.html
newland.js的Ioc实现相关推荐
- Vue.js的IoC容器模式探索
IoC概念阐述 IoC(Inversion of Control),意为控制反转,不是什么技术,而是一种设计思想.==Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制==. ...
- adonis.js mysql_Node.js:Adonis.js 框架 IoC container
IoC:Inversion of Control,字面的意思是控制反转,它是一种程序设计的思路.Container 不装在哪出现,一般它都指的就是容器,只不过在什么地方出现,容器里装的东西都不太一样. ...
- 【转】Nutz | Nutz项目整合Spring实战
http://blog.csdn.net/evan_leung/article/details/54767143 Nutz项目整合Spring实战 前言 Github地址 背景 实现步骤 加入spri ...
- (转)Nutz | Nutz项目整合Spring实战
http://blog.csdn.net/evan_leung/article/details/54767143 Nutz项目整合Spring实战 前言 Github地址 背景 实现步骤 加入spri ...
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- Nutz | Nutz项目整合Spring实战
Nutz项目整合Spring实战 前言 Github地址 背景 实现步骤 加入springMvc与Spring 相关配置 新增Spring相关配置 新增SpringIocProvider 重写Nutz ...
- 使用Chrome控制台进行3D模型编辑的尝试
前言:3D模型编辑的核心是对顶点位置和纹理颜色的编辑,这个研究的目的在于寻找一种通过编程方式直接对模型进行编辑的方法,这种编辑方法和时下流行的通过鼠标点选.拖拽进行编辑的方法之间的关系,和前端编程中& ...
- Spring Boot + Vue.js 实现前后端分离(附源码)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 梁小生0101 链接:juejin.im/post/5c6 ...
- 带你理清Node.js 的Web框架的3个层次
web 框架指的是处理 http.https 的服务端框架,Node.js 提供了 http.https 模块用于处理协议数据,这是 web 框架的基础. 但是 http.https 的 api 过于 ...
- rds基于什么开发_为什么不学基于TypeScript的Node.js服务端开发?
为什么不学?学不动了吗?!别躺下啊,我扶你起来! 我们早就知道,如今的JavaScript已经不再是当初那个在浏览器网页中写写简单的表单验证.没事弹个alert框吓吓人的龙套角色了.借助基于v8引擎的 ...
最新文章
- .NET BitmapImage 内存释放问题解决方案
- python【蓝桥杯vip练习题库】BASIC-23芯片测试(统计)
- 云计算入门学习资料,linux云计算学习大纲
- PHP解决方案@时间戳与时间日期
- 解密初、中、高级程序员的进化之路
- 微软Workflow Foundation 高阶透视
- [OS复习]进程管理5
- 全国高速恢复收费!阿里云:自由流“3大特色能力”使能智慧之路
- Go Little Book - 第三章 - 字典 ,数组和切片
- fscapture设置中文_Fscapture是什么软件?有没有功能介绍?
- wps 甘特图_【WPS神技能】在Excel表格中用图表阶梯式的展示任务进程?找甘特图呀...
- 使用ExtendSim进行物流、供应链和运输建模仿真
- mysql监控工具-PMM,让你更上一层楼(下)
- (学习)如何科学合理的制定目标
- 华为防火墙nat技术之服务器映射
- 三角网格剖分工具 Triangle 安装及使用
- win10 设备管理器中没端口选项解决方法
- kal渗透----缓冲区溢出个人笔记
- 用python提取文字中省份与城市
- 如何使用Tableau进行预测分析