Перейти до основного вмісту

Хелпер ProviderBuilder

Даний клас спрощує додавання провайдерів до DI з одночасним контролем їх типів. Оскільки даний клас впроваджує так званий Iteration protocols, це спрощує перетворення його на масив (зверніть увагу на трикрапку):

import { ProviderBuilder } from '@ditsmod/core';
import { restModule } from '@ditsmod/rest';
// ...
@restModule({
// ...
providersPerRou: [
Provider1,
Provider2,
...new ProviderBuilder().useValue<CorsOptions>(CorsOptions, { origin: 'https://example.com' }),
// ...
],
// ...
})
export class SomeModule {}

Починаючи з v2.55, Ditsmod дозволяє передавати інстанс ProviderBuilder безпосередньо у властивості providersPer* метаданих модуля чи контролера:

import { ProviderBuilder } from '@ditsmod/core';
import { restModule } from '@ditsmod/rest';
// ...
@restModule({
// ...
providersPerRou: new ProviderBuilder()
.passThrough(Provider1)
.passThrough(Provider2)
.useValue<CorsOptions>(CorsOptions, { origin: 'https://example.com' }),
// ...
})
export class SomeModule {}

Метод providers.passThrough() пропускає провайдери без перевірки типів, він призначається для передачі класів у якості провайдерів.

Окрім цього, ProviderBuilder має спеціальний метод $if(), що дозволяє передавати провайдери лише у випадку, якщо він отримує правдиве значення:

import { ProviderBuilder } from '@ditsmod/core';
import { restModule } from '@ditsmod/rest';
// ...
@restModule({
// ...
providersPerRou: new ProviderBuilder()
.passThrough(Provider1)
.$if(false)
.passThrough(Provider2)
.passThrough(Provider3),
// ...
})
export class SomeModule {}

В даному разі Provider2 не буде передаватись до DI, тоді як Provider1 та Provider3 будуть передаватись. Тобто $if() діє лише для першого виразу, що йде зразу після нього.

Метод providers.$use() дозволяє створювати плагіни (чи middleware) для розширення функціональності ProviderBuilder:

class Plugin1 extends ProviderBuilder {
method1() {
if (this.true) {
// ...
}
return this.self;
}
}

class Plugin2 extends ProviderBuilder {
method2() {
if (this.true) {
// ...
}
return this.self;
}
}

const providers = [...new ProviderBuilder()
.$use(Plugin1, Plugin2)
.method1()
.method2()
.useLogConfig({ level: 'trace' })
.useClass(SomeService, ExtendedService)];