# Dependency Injection for TypeScript

tags: TypeScript DI

---

在学习Angular2的时候遇到了依赖注入，发现这个东西非常有用。于是便尝试自己实现了一下。


##API
目前只有几个API：

* @Injectable()
* @Singleton()
* Injector.get()

##示例

#### @Injectable()
```TypeScript
@Injectable()
class A {
}

@Injectable()
class B {
    private val = '1234';

    constructor(private a: A) {
    }

    getVal() {
        return this.val;
    }

    setVal(newval) {
        this.val = newval;
    }
}

// 使用Injector.get，不需要提供参数即可获取实例
let b = Injector.get(B);
let b2 = Injector.get(B);

// 测试：同一个Class可以被实例化多次，每个实例都是不同的对象。
let newVal = 'zzzz';
b.setVal(newVal);

assert.equal(b.getVal(), newVal);
assert.equal(b2.getVal(), '1234');
```

####@Singleton
```TypeScript
@Singleton()
class SingletonClass {
    private val = '1234';

    constructor(private a: A) {
    }

    get() {
        return this.val;
    }

    set(newval) {
        this.val = newval;
    }
}

let b = Injector.get(SingletonClass);
let b2 = Injector.get(SingletonClass);

// 测试：被@Singleton()装饰的类，所有句柄都应该指向同一个对象
let newVal = 'zzzz';
b.set(newVal);

assert.equal(b.get(), newVal);
assert.equal(b2.get(), newVal);

```

## 构建&测试

    >npm install
    >npm test

## 为什么是@Injectable()而不是@Injectable
装饰器本不需要添加一个括号的。就像这样：
```TypeScript
@Injectable
class A{}
```
强制性添加括号是为了和Angular2的装饰器保持一致；也为了实现更好的扩展性。