我正处于node.js项目的早期阶段,我正在寻求改进整个应用程序组织.在过去,我使用Symfony2(PHP),现在我在Angular中编写了很多代码,这两者都非常依赖于DI.所以,我真的很喜欢在node.js项目中应用相同原理的想法.
我知道包的存在Rewire,但是现在我想尝试DI方法.问题是,如何实现均衡以保持轻量级的感觉,使得与节点一起使用经过良好测试的依赖注入应用程序的可靠性(我知道经过充分测试的是给出了可靠性;-)).
其中一个问题是,如何管理外部模块,如果某个对象需要fs模块该怎么办?正如Vojta Jina(来自AngularJS)在本文中所述:
所以对我来说最好的方法是这样的:模块是无状态的.它们只包含类/函数/常量的定义.
所以,我想我必须注入一切:
function Foo(fs) {
this.fs = fs;
}
Foo.prototype.doSomething: function () {
// this.fs...
};
module.exports = Foo;
Run Code Online (Sandbox Code Playgroud)
某处:
var fs = require('fs');
var Foo = require('./Foo');
var foo = new Foo(fs);
foo.doSomething();
Run Code Online (Sandbox Code Playgroud)
由于Express用于apply()调用处理程序,因此上下文丢失,我们无法使用this.所以我们留下了这些:
// foo.js
function Foo(fs) {
this.fs = fs;
}
Foo.prototype.index = function () {
var self = this;
return function (req, res, next) {
// …Run Code Online (Sandbox Code Playgroud) 我有这个正则表达式(它没有做我想要的):/^.*\/(eu|es)(?:\/)?([^#]*).*/实际上是js版本:/^.*/(eu|es)(?:/)?([^#]*).*/
嗯,它没有做我想要的,当然它的工作原理.:)鉴于此URL:
前两个网址按预期工作.第三个不是我想要的.由于后来在网址上找到"eu",它与第二个eu而不是第一个eu匹配.所以我希望它符合这个:[1] ='eu',[2] ='bla/eubla'
我该怎么办?
谢谢.:)
所以,我有以下界面:
interface DoStuffInterface {
doStuff(value: string | number): string | number;
}
Run Code Online (Sandbox Code Playgroud)
为什么在实现这个接口时TS不强制签名?
class NumberStuff implements DoStuffInterface {
public doStuff(value: number): string | number { // <====== missing: | string
return value;
}
}
class StringStuff implements DoStuffInterface {
public doStuff(value: string): string | number { // <====== missing: | number
return value.toLowerCase();
}
}
Run Code Online (Sandbox Code Playgroud)
这很容易被这样的东西打破:
var numberStuff = new NumberStuff();
var stringStuff = new StringStuff();
function run(thing: DoStuffInterface): void {
console.log(thing.doStuff(42));
}
run(numberStuff);
run(stringStuff); // <====== this fails, due …Run Code Online (Sandbox Code Playgroud)