Колізії провайдерів
Колізії провайдерів виникають тоді, коли у поточний модуль імпортуються різні провайдери, що надають один і той самий сервіс.
Давайте розбиремо конкретний приклад. Уявіть, що у вас є Module3
, куди ви імпортували Module2
та Module1
. Ви зробили такий імпорт, бо вам потрібні відповідно Service2
та Service1
із цих модулів. Ви проглядаєте результат роботи даних сервісів, але по якійсь причині Service1
працює не так як очікується. Ви починаєте дебажити і виявляється, що Service1
експортується з обох модулів: Module2
та Module1
. Ви очікували, що Service1
експортуватиметься лише з Module1
, але насправді спрацювала та версія, що експортується з Module2
:
import { featureModule, rootModule } from '@ditsmod/core';
class Service1 {}
class Service2 {}
@featureModule({
providersPerMod: [Service1],
exports: [Service1]
})
class Module1 {}
@featureModule({
providersPerMod: [{ token: Service1, useValue: 'some value' }, Service2],
exports: [Service1, Service2],
})
class Module2 {}
@rootModule({
imports: [Module1, Module2],
})
class Module3 {}
Щоб цього не сталось, якщо ви імпортуєте два або більше модулі, в яких експортуються неідентичні провайдери з однаковим токеном, Ditsmod кидатиме приблизно таку помилку:
Error: Importing providers to Module3 failed: exports from Module1, Module2 causes collision with Service1. You should add Service1 to resolvedCollisionsPerMod in this module. For example: resolvedCollisionsPerMod: [ [Service1, Module1] ].
Конкретно у цій ситуації:
- і
Module1
експортує провайдер з токеномService1
; - і
Module2
підмінює, а потім експортує провайдер з токеномService1
; - провайдери з токеном
Service1
є неідентичними уModule1
таModule2
.
І оскільки обидва ці модулі імпортуються у Module3
, якраз тому і виникає "колізія провайдерів", розробник може не знати який провайдер буде працювати в Module3
.