midwayjs / injection

Injection is a powerful inversion of control container that is widely used in the midway framework and brings good user experience.
MIT License
160 stars 20 forks source link

使用了 `@provide` 之后,还是需要 `container.bind` 吗? #18

Closed xcatliu closed 5 years ago

xcatliu commented 5 years ago

文档中说:

有了 @provide() 装饰器,就可以简化绑定,被 IoC 容器自动扫描,并绑定定义到容器上,对应的逻辑是 绑定对象定义。

但是 README.md 里面的例子中还是调用了 container.bind

import {Container, provide, inject} from 'injection';

@provide('userModel')
class UserModel {

}

@provide('userService')
class UserService {
  async getUser(uid: number) {
    // TODO
    return 'Alex'
  }
}

const container = new Container();
container.bind(UserService);
container.bind(UserModel);

async function getData() {
    const userService = await container.getAsync<UserService>('userService');
    const data = await userService.getUser(123);

    return data;
}

getData().then(console.log);

这个例子是可以正常运行的,但是如果去掉这两行

container.bind(UserService);
container.bind(UserModel);

那么就会报错了:

UnhandledPromiseRejectionWarning: Error: userService is not valid in current context
czy88840616 commented 5 years ago

目前自动扫描能力是写在 midway-core 中,injection 本身只有单独绑定的能力。https://github.com/midwayjs/midway/blob/master/packages/midway-core/src/loader.ts#L62

xcatliu commented 5 years ago

知道了,感谢🙏

ashuihui commented 4 years ago

和midway绑定太深了,单独使用很多东西都得再重复建设

czy88840616 commented 4 years ago

之前抽象了一个单独的模块,发现很多需要的能力还是和上层框架和场景绑定,不然太纯粹的东西很难去发展,所以今年把injection 合并到了 midway/core 中,理论上也能单独使用。