是否有任何方法可以避免在其他模块中声明的注入令牌的预先声明



我正在创建一个EventPublisher,它必须在构造函数中具有3个依赖项

需要依赖项的发布服务器


@Injectable()
export class EventStorePublisher implements IEventPublisher {
constructor(private readonly eventStore: IEventStore,
@Inject('STREAM_NAME_PUBLISHER') private readonly category: string,
@Inject('ID_ATTRIBUTE_NAME_PUBLISHER') private readonly idName: string) {
}
}

我想通过这种方式自定义发布。

它是util模块的一部分,目前不知道在里面注入哪个字符串:

Util模块

@Global()
@Module({
providers: [
{
provide: IEventStore,
useClass: EventStore,
},
//...
],
exports: [
{
provide: IEventStore,
useClass: EventStore,
},
//...
],
})
export class EventStoreModule {
//...
static forFeature(): DynamicModule {
return {
module: EventStoreModule,
providers: [
EventStorePublisher,
{
provide: "STREAM_NAME_PUBLISHER",
useValue: null
},
{
provide: "ID_ATTRIBUTE_NAME_PUBLISHER",
useValue: null
},
],
exports: [
EventStorePublisher,
{
provide: "STREAM_NAME_PUBLISHER",
useValue: null
},
{
provide: "ID_ATTRIBUTE_NAME_PUBLISHER",
useValue: null
},
],
};
}
}

我没有找到任何其他方法来防止NestJS抛出关于缺少标记STREAM_NAME_PUBLISHERID_ATTRIBUTE_NAME_PUBLISHER的定义的错误。我被迫提供它们并导出它们,否则模块将无法工作。

当涉及到需要自定义类别和idName:的模块时

将自定义我的代币的最终模块

@Module({
imports: [
CqrsModule,
EventStoreModule.forFeature(),
EventStorePublisher,
],
providers: [
//...
{
provide: "STREAM_NAME_PUBLISHER",
useValue: "person"
},
{
provide: "ID_ATTRIBUTE_NAME_PUBLISHER",
useValue: "personId"
},
{
provide: EventStorePublisher,
useFactory: (eventStore:IEventStore,category: string, id: string) => new EventStorePublisher(eventStore, category,id),
inject: [IEventStore, "STREAM_NAME_PUBLISHER", "ID_ATTRIBUTE_NAME_PUBLISHER"]
},
],
controllers: [
//...
],
})
export class PersonModule implements OnModuleInit {
//...
}

是否有任何方法可以避免在EventStoreModule中使用null预先声明?我希望这些令牌总是被使用这个EventStoreModule的每个模块覆盖,我想出的想法看起来非常非常丑陋。

我已经实现了类似的东西,但总的来说,做起来肯定很麻烦。对于我的代码,我最终实现了一种NoopService类型的方法,在这种方法中,代码尽可能地最小化,什么都不做,只让事情通过。我的所有要覆盖的提供者都用初始化了

{
provide: ProviderName,
useClass: NoopService,
}

这样,我就可以让提供者正确地初始化,而不用担心任何代码在其中运行。这也导致需要对代码进行大量检查,因为我不希望这些NoopService实际做任何事情。如果您想查看它,代码库就在这里,特别是在ogma-core.module.tsogma.providers.tsinterceptor/ogma.intereptor.ts文件中(以及您可以从中遵循的文件(。

最新更新