一致性配置在Node.js开发中,系统需要配置的参数本质上其实就是设置函数的参数或者对象的属性。 比如要创建一个Redis连接,就是传入一个Redis的host,port参数: var serverConfig = require('../../config/server');var redis = require("redis");var client = redis.createClient(serverConfig['redisPort'], serverConfig['redisHost']);client.on("error", function(err) { console.error("redis error " + err);});client.on("ready", function() { console.log("redis is ready");});module.exports = client; 上面的做法简单粗暴,但是配置往往是与环境相关的。开发环境、测试环境、线上环境的redis port、host都不一样,因此这样的做法就无法解决环境切换的问题,要么就只能根据不同环境来对config/server文件进行替换,做法相当的粗暴,很容易出现问题。 通过IoC,配置问题就将的变得非常简单,环境切换也变得自然无缝。比如说car里面一个num属性需要进行配置: var Car = function() { this.num = null;}Car.prototype.run = function() { console.log('run car' + this.num); return 'car' + this.num;}module.exports = Car; 在context.json中,可以配置 num 为一个 ${car.num} 的占位符: { "name": "simple", "beans": [{ "id": "car", "func": "car", "props": [{ "name": "num", "value": "${car.num}" }] }]} ${car.num} 占位符最终会被特定环境下的值所替代。在config文件夹下面,对不同环境分不同的子目录,开发环境对应于dev,生产环境对应于prod,里面有car.num具体的配置: ├─┬ placeholderSample/│ ├─┬ config/│ │ └─┬ dev/│ │ │ └── car.json│ │ └─┬ prod/│ │ └── car.json│ └── car.js└── context.json { "car.num": 100} 通过启动参数指定env的值来部署到不同的环境中。部署到生产环境中的示例如下: node app.js env=prod 总结本文中深入介绍了IoC在Node.js中的应用以及所给Node.js开发带来的便捷与好处。IoC可以去除代码之间的直接依赖关系,降低了耦合性。通过灵活可配置可重用的元数据配置,开发者在进行开发的时候面对的就不仅仅是一个个对象个体,而是弹性可配置的整体。IoC同时使得根据环境进行配置变得简单与无缝。 参考资料
|