转载请注明出处: http://qiudeqing.com/notes/2015/12/03/reliable-javascript.html

2 Tooling up

使用依赖注入框架

最简陋的依赖注入

Attendee = function (service, messenger, attendeeId) {
  if (!(this instanceof Attendee)) {
    return new Attendee(attendeeId);
  }
  this.attendeeId = attendeeId;
  this.service = service;
  this.messenger = messenger;
}

var attendee = new Attendee(new ConferenceWebSvc(), new Messenger(), id);

依赖注入注意事项

创建新对象时, 如果一下问题的任意一项答案为Yes, 应当使用注入而不是直接实例化

案例研究: 实现一个轻量级依赖注入框架

专业的依赖注入框架工作模式如下:

  1. 当应用程序启动之后, 在框架容器内注册可注入的元素, 每个元素用名字区分
  2. 当需要对象时, 从容器获取
  3. 容器实例化你需要的对象, 实例化的过程中可能需要递归实例它所依赖的对象

我们的容器应该做两件事:

我的注册函数register需要三个参数

TDD要求每一个阶段编写最少的代码, 所以我们以一个空函数开始. 因为这个函数应该被所有DiContainer实例共享, 我们把它放在原型上.

DiContainer = function () {};

DiContainer.prototype.register = function (name, depencencies, func) {};

我们为这个函数编写测试用例DiContainer00-test.js, 需要注意:

现在执行测试会失败, 我们需要给register函数添加类型检查DiContainer01.js

DiContainer.prototype.messages = {
  registerRequiresArgs: 'The register function requires three arguments: ' +
    'a string, an array of strings, and a function'
};

我们将错误提示信息包含在prototype中, 方便用户自定义修改, 维护.

下一步我们实现get(name)函数, 根据名字实例化对象, 仍然先写测试用例检查类型