如何在TypeDI或Inversify中定义第三方依赖?
如何在TypeDI/Inversify中注入第三方库类实例?
不管是TypeDI还是Inversify,都不需要修改第三方库的源码,直接通过容器的注册/绑定API就能实现第三方类的依赖注入,以下是具体实现方式:
TypeDI 实现方式
TypeDI允许直接通过Container.set或Container.register为第三方类注册实例创建逻辑,无需给第三方类添加任何注解。
1. 注册带参数的第三方类
如果第三方类实例化需要传入配置参数,使用工厂函数注册:
import { Container } from 'typedi'; import { ThirdPartyService } from 'third-party-lib'; // 注册第三方类的实例工厂 Container.set(ThirdPartyService, { factory: () => new ThirdPartyService({ apiKey: 'your-api-key', timeout: 5000 }) });
2. 注册无参数的第三方类
如果第三方类不需要参数,可直接注册实例或绑定类:
// 方式1:直接注册实例 Container.set(ThirdPartyService, new ThirdPartyService()); // 方式2:绑定类,容器会自动实例化 Container.register(ThirdPartyService, { useClass: ThirdPartyService });
3. 在自定义类中注入
注册完成后,直接在自定义类的构造函数中声明依赖即可:
class MyBusinessService { constructor(private thirdPartyService: ThirdPartyService) {} runTask() { return this.thirdPartyService.processData(); } } // 从容器获取自定义类实例,第三方依赖会自动注入 const service = Container.get(MyBusinessService);
Inversify 实现方式
Inversify需要通过container.bind绑定第三方类,结合@inject装饰器完成注入,支持类绑定、工厂绑定、常量值绑定三种方式。
1. 直接绑定第三方类
如果第三方类是可直接实例化的类,可使用toSelf()绑定:
import { Container, inject, injectable } from 'inversify'; import { ThirdPartyService } from 'third-party-lib'; const container = new Container(); // 绑定第三方类到容器 container.bind<ThirdPartyService>(ThirdPartyService).toSelf(); // 自定义类标记为可注入,并注入第三方依赖 @injectable() class MyBusinessService { constructor(@inject(ThirdPartyService) private thirdPartyService: ThirdPartyService) {} runTask() { return this.thirdPartyService.processData(); } } // 绑定自定义类 container.bind<MyBusinessService>(MyBusinessService).toSelf(); // 获取实例 const service = container.get(MyBusinessService);
2. 绑定带参数的第三方类(工厂方式)
如果第三方类需要传入参数,使用toFactory提供实例化逻辑:
container.bind<ThirdPartyService>(ThirdPartyService).toFactory(() => { return () => new ThirdPartyService({ apiKey: 'your-api-key' }); });
3. 使用自定义标识符绑定
如果第三方类是接口或无法直接用类作为标识,可自定义Symbol作为标识符:
import { Container, inject, injectable } from 'inversify'; import { ThirdPartyService } from 'third-party-lib'; // 自定义标识符 const THIRD_PARTY_SERVICE = Symbol('ThirdPartyService'); const container = new Container(); // 绑定到常量实例(或工厂) container.bind<ThirdPartyService>(THIRD_PARTY_SERVICE).toConstantValue( new ThirdPartyService({ apiKey: 'your-api-key' }) ); @injectable() class MyBusinessService { constructor(@inject(THIRD_PARTY_SERVICE) private thirdPartyService: ThirdPartyService) {} }
内容的提问来源于stack exchange,提问作者Jed
相关产品推荐
相关产品推荐

