当前位置: 首页 > 后端技术 > Node.js

【译文】Node.js中的依赖注入

时间:2023-04-03 10:31:31 Node.js

简介了解了依赖注入的相关概念,我们来看看如何在Node.js中使用依赖注入。原文:Node.jsOriginMyGitHubLiteralDependencyInjection中的依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)通过引用注入或传递到依赖对象中。使用依赖注入的原因解耦依赖注入可以降低模块的耦合度,从而使代码库更易于维护。为了便于单元测试,您可以将它们传递到您想要使用的模块中,而不是硬编码依赖项。在大多数情况下,您不必使用像proxyquire这样的模块。快速开发使用依赖注入,一旦你定义了你的接口,你就可以轻松地工作而没有任何合并冲突。如何使用Node.js依赖注入首先,让我们看看如何在不使用依赖注入的情况下编写应用程序,以及如何转换它。没有依赖注入的示例模块//team.jsvarUser=require('./user');functiongetTeam(teamId){returnUser.find({teamId:teamId});}module.exports.getTeam=getTeam;一个简单的测试如下所示://team.spec.jsvarTeam=require('./team');varUser=require('./user');describe('Team',function(){it('#getTeam',function*(){varusers=[{id:1,id:2}];this.sandbox.stub(User,'find',function(){returnPromise.resolve(users);});varteam=yieldteam.getTeam();expect(team).to.eql(users);});});我们在这里所做的是创建一个名为team.js的文件,该文件返回属于单个团队的用户列表。为此,我们需要User模型,因此我们可以调用它的find方法,该方法返回一个用户列表。看起来不错,对吧?但是在测试的时候,我们必须使用测试存根。在测试文件中,我们还需要requireUser模型,以便我们可以存根它的find方法。请注意,我们这里使用的是沙盒功能,因此我们不必在测试运行后手动恢复原始功能。使用依赖注入的示例模块//team.jsfunctionTeam(options){this.options=options;}Team.prototype.getTeam=function(teamId){returnthis.options.User.find({teamId:teamId})}functioncreate(options){returnnewTeam(options);}你可以用下面的测试用例来测试这个文件://team.spec.jsvarTeam=require('./team');describe('Team',function(){it('#getTeam',function*(){varusers=[{id:1,id:2}];varfakeUser={find:function(){返回承诺。resolve(users);}};varteam=Team.create({User:fakeUser});varteam=yieldteam.getTeam();expect(team).to.eql(users);});});好的,所以依赖注入版本和以前的版本有什么不同?您首先会注意到工厂模式的使用:我们使用它来将选项/依赖项注入新创建的对象——这是我们可以注入用户模型的地方。在测试文件中,我们必须创建一个代表User模型的假模型,然后我们通过将其传递给Team模型的create函数来简单地注入该模型。简单吧?真实项目中的依赖注入您可以在许多开源项目中找到依赖注入的示例。例如,您在日常工作中使用的大多数Express/Koa中间件都采用相同的方法。Express中间件varexpress=require('express');varapp=express();varsession=require('express-session');app.use(session({store:require('connect-session-knex')()}));上面的代码片段使用工厂模式依赖注入:将connect-session-knex模块传递给会话中间件——它必须实现会话模块将调用的接口。在本例中,connect-session-knex模块必须实现以下方法:store.destroy(sid,callback)store.get(sid,callback)store.set(sid,session,callback)Hapiplugins同样的概念也可以可以在FoundinHapi中找到-下面的示例将handlebars模块注入Hapi以用作视图引擎。server.views({engines:{html:require('handlebars')},relativeTo:__dirname,path:'templates'});Node.js中的引用依赖注入