【问题标题】:TypeDI @Inject() doesn't work, but Container.get() doesTypeDI @Inject() 不起作用,但 Container.get() 可以
【发布时间】:2019-09-05 04:12:45
【问题描述】:

我遇到了奇怪的问题, Container.get(MyServiceName);返回请求的服务,但用@Inject() 修饰的类属性未定义。

我试过用@Service() 装饰类

我确实在我的应用程序的入口点导入反射元数据 导入“反射元数据”;

我想知道这是否与我使用 typedi 不是直接来自我的 node_modules 而是来自我的依赖项的事实有关?

应用程序既不使用 Express 框架也不使用路由控制器

我的 tsconfig.json:

"compilerOptions": {

    "declaration": true,
    "pretty": true,
    "esModuleInterop": true,
    "target": "esnext",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noUnusedLocals": false,
    "moduleResolution": "node",
    "noUnusedParameters": true,
    "strictPropertyInitialization": false,
    "module": "commonjs",
    "lib": ["dom", "es2018"],
    "importHelpers": true,
    "outDir": "./dist",
    "strict": true,
    "typeRoots": ["node_modules/@types"],
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "sourceMap": true
  },
  "include": ["./src/**/*"],
  "exclude": ["node_modules", "./dist/**/*"]
}

我要注入的服务

import MyServiceName from '../services/MyServiceName';
import { Container, Inject, Service } from 'my_dependency/lib';

export default class SomeClass{
  @Inject()
  private readonly someService: MyServiceName;

  public async someMethod(): SomeResponseType {
    const thatWorks = Container.get<MyServiceName>(MyServiceName);
    console.log(this.someService); // undefined
    console.log(thatWorks); // proper class
  }
}

我要注入的服务

@Service()
export default class MyServiceName {
  public async someMethod(): SomeReturnType {
    return someReturnedData;
  }
}

我想通过 @Inject() 装饰器注入我的依赖项

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    您需要使用Container#get 创建您的SomeClass 实例,否则容器将无法注入该属性。

    这对我有用:

    // a.ts
    import { Service } from "typedi";
    @Service()
    export class Foo {
      foo() {
        return 10;
      }
    }
    
    // b.ts
    import { Foo } from "./a";
    import { Inject } from "typedi";
    
    export class Bar {
      @Inject() private readonly service: Foo
      foo() {
        console.log(this.service);
      }
    }
    
    // test.ts
    import "reflect-metadata";
    import { Bar } from "./b";
    import { Container } from "typedi";
    
    const noFoo = new Bar();
    noFoo.foo(); // yields undefined
    
    const withFoo = Container.get<Bar>(Bar);
    withFoo.foo(); // yields Foo
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2015-10-11
      • 2012-02-01
      相关资源
      最近更新 更多