依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)被注入或通过引用传递到依赖对象中。
依赖注入使你的模块耦合性降低,从而产生更易于维护的代码库。
你可以将它们传递到你想要使用的模块中,而不是使用硬编码的依赖项。在大多数情况下,你不必使用 proxyquire 这样的模块。
使用依赖注入,定义接口之后,就可以轻松地工作,不会出现任何合并冲突。
首先,让我们看看如何在不使用依赖注入的情况下编写你的应用程序,以及如何转换它。
// team.js
var User = require('./user');
function getTeam(teamId) {
return User.find({teamId: teamId});
}
module.exports.getTeam = getTeam;
一个简单的测试如下所示:
// team.spec.js
var Team = require('./team');
var User = require('./user');
describe('Team', function() {
it('#getTeam', function* () {
var users = [{id: 1, id: 2}];
this.sandbox.stub(User, 'find', function() {
return Promise.resolve(users);
});
var team = yield team.getTeam();
expect(team).to.eql(users);
});
});
我们在这里所做的是创建了一个名为 team.js 的文件,它可以返回属于单个团队的用户列表。为此,我们需要 User 模型,因此我们可以调用它的 find 方法,该方法返回一个用户列表。
看起来不错,对吧?但在测试时,我们必须要使用测试存根。
在测试文件中,我们还需要 require User 模型,这样就可以存根它的 find 方法。请注意,我们在这里使用的是沙盒特性,因此不必在测试运行后手动恢复原始函数。
// team.js
function Team(options) {
this.options = options;
}
Team.prototype.getTeam = function(teamId) {
return this.options.User.find({teamId: teamId})
}
function create(options) {
return new Team(options);
}
你可以使用以下测试用例测试此文件:
// team.spec.js
var Team = require('./team');
describe('Team', function() {
it('#getTeam', function* () {
var users = [{id: 1, id: 2}];
var fakeUser = {
find: function() {
return Promise.resolve(users);
}
};
var team = Team.create({
User: fakeUser
});
var team = yield team.getTeam();
expect(team).to.eql(users);
});
});
好的,那么依赖注入的版本和上一个版本有何不同呢?你可以注意到的第一件事是工厂模式的使用:我们使用它向新创建的对象注入选项/依赖项—这是我们可以注入 User 模型的地方。
在测试文件中,我们必须创建一个表示 User 模型的假模型,然后我们只需通过将其传递给 Team 模型的 create 函数来注入这个模型。很简单,对吧?
你可以在很多开源项目中找到依赖注入的例子。例如,你在日常工作中使用的大多数 Express/Koa 中间件都使用相同的方法。
var express = require('express');
var app = express();
var session = require('express-session');
app.use(session({
store: require('connect-session-knex')()
}));
上面的代码片段使用工厂模式的依赖注入:向 session 中间件传递 connect-session-knex 模块-它必须实现一个接口,session 模块将调用该接口。
在这个示例中,connect-session-knex 模块必须实现以下方法:
同样的概念也可以在 Hapi 中找到-下面的示例将 handlebars 模块作为视图引擎注入 Hapi 中使用。
server.views({
engines: {
html: require('handlebars')
},
relativeTo: __dirname,
path: 'templates'
});
Dependency Injection in Node.js
原文:Dependency Injection in Node.js
前端的技术的极速发展,对前端同学来说也是一个不小的挑战,有各种各样的东西需要学,在开发过程中经常会被后端同学嘲讽,对于前端来讲根本就不存在类的概念,很多时候需要把大量的业务代码堆积在页面或者组件中
在组件上面使用 ref 这个属性绑定,属性值自取,然后就可以通过 $refs.属性名 这种方式去获取到指定组件的实例了。其实不仅仅是组件能够使用 ref ,标签元素也能使用。
Vue SFC 样式提供了直接的 CSS 搭配和封装,但它是纯粹的静态的 —— 这意味着到目前为止,我们没有能力在运行时根据组件的状态动态更新样式。现在,随着大多数现代浏览器支持原生 CSS 变量,我们可以利用它来轻松连接组件的状态和样式。
我们假设你了解 JavaScript 的基本语法,并熟悉面向对象编程的基本概念,例如类和接口。不过,你不需要详细了解类和接口的TypeScript 语法,因为我们会在这篇文章中用到它。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!