【问题标题】:Nestjs - Manually instantiate a class with dependencies on useFactoryNestjs - 手动实例化一个依赖于 useFactory 的类
【发布时间】:2022-01-28 07:10:27
【问题描述】:

假设我有两个这样的类

@Injectable({ scope: Scope.DEFAULT })
class Service {
    
    constructor() {}
    // ...
}

@Injectable()
class OtherService {
    param: T;

    constructor(readonly service: Service, param: T) {}

    // ... 
}

我正在尝试使用工厂动态实例化最后一个类

const otherServiceFactory = {
    provide: "TOKEN",
    scope: Scope.Request,
    useFactory: (req: Request) => {
        const param = req.headers["foo"];
        return new OtherService(/* ts expects an instance of Service here */ , param)
    },
    inject: [REQUEST]
}

正如评论所说,在创建实例 ts 时,正确地期望Service 的实例。问题是我不想弄乱 DI 树,所以我不想实例化Service。我可以通过稍后设置参数而不是在构造函数中询问来解决这个问题,所以我不再需要工厂,但感觉非常不理想。有什么建议吗?

谢谢

【问题讨论】:

    标签: typescript dependency-injection nestjs


    【解决方案1】:

    您可以将Service 添加到inject 数组中,并获取Nest 创建的Service 实例,然后将其传递给OtherService,这样您就拥有了创建类所需的一切。

    const otherServiceFactory = {
        provide: "TOKEN",
        scope: Scope.Request,
        useFactory: (req: Request, service: Service) => {
            const param = req.headers["foo"];
            return new OtherServiceservice, param)
        },
        inject: [REQUEST, Service]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多