Шаблон для включения настройки через DI

Я смотрю на реализацию in-memory-web-api и там следующий код:

@Injectable()
export class InMemoryBackendService {
  protected config: InMemoryBackendConfigArgs = new InMemoryBackendConfig();
            ^^^^^^
  ...

      constructor(
        @Inject(InMemoryBackendConfig) @Optional() config: InMemoryBackendConfigArgs 
                                                   ^^^^^^
        ) {
        ...

Как я понимаю, картина следующая:

  1. Определить свойство класса и создать зависимость без использования DI
  2. При желании ввести зависимость

Если пользователь предоставляет измененную зависимость через DI, она будет внедрена, а заданная по умолчанию копия без DI будет переопределена. Я подозреваю, что нечто подобное может быть с RequestOptions в HTTP модуль.

Это общий шаблон?

РЕДАКТИРОВАТЬ:

Оказывается, что in-memory-web-api это не тот шаблон, о котором я спрашиваю. Предположим, у меня есть класс A который использует экземпляр класса B вводимый токеном B, Таким образом, они оба зарегистрированы с корневым инжектором:

провайдеры: [A, B]

Теперь, если пользователь хочет настроить Bон может зарегистрировать настроенную версию под тем же самым токеном, таким образом эффективно перекрывая оригинал B:

providers: [{provide:B, useClass: extendedB}]`

Вот как RequestOptions может быть расширен в http модуль.

1 ответ

Решение

Значение по умолчанию не просто переопределено. Самая важная часть здесь

Object.assign(this.config, config || {})

Ничего не случилось бы без этого.

Этот шаблон не специфичен для DI, это обычный рецепт для значений свойств по умолчанию, аналогичный _.defaults,

Я бы сказал, что InMemoryBackendConfig реализация по умолчанию здесь - бесполезная абстракция. поскольку this.config всегда объединяется с configпервый может быть просто объектом

  protected config: InMemoryBackendConfigArgs = { ... };

InMemoryBackendConfig а также RequestOptions использовать сложные варианты этого шаблона. Да, в самой основной форме это как это можно сделать:

providers: [{provide:B, useClass: extendedB}]`

Эта модель широко используется constant сервисы в AngularJS для объектов конфигурации, но имеющие B так как класс вместо простого объекта позволяет расширять исходные значения вместо их замены.

Другие вопросы по тегам