Шаблон для включения настройки через DI
Я смотрю на реализацию in-memory-web-api и там следующий код:
@Injectable()
export class InMemoryBackendService {
protected config: InMemoryBackendConfigArgs = new InMemoryBackendConfig();
^^^^^^
...
constructor(
@Inject(InMemoryBackendConfig) @Optional() config: InMemoryBackendConfigArgs
^^^^^^
) {
...
Как я понимаю, картина следующая:
- Определить свойство класса и создать зависимость без использования DI
- При желании ввести зависимость
Если пользователь предоставляет измененную зависимость через 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
так как класс вместо простого объекта позволяет расширять исходные значения вместо их замены.