Избегайте циклических зависимостей с помощью шаблона посредника AngularJS

У меня два сервиса и посредник. Если я хочу, чтобы посредник вызывал И вызывался обеими службами, я думаю, что мне нужно сделать их зависимыми друг от друга. Это вызывает ошибку циклической зависимости.

Person Зависит от Mediator для вызова Mediator методов

Mediator Зависит от Person для вызова Person методов

Является ли единственным решением использование событий или обещаний? Правильно ли я реализую этот шаблон?


person Chris Bier    schedule 18.12.2013    source источник
comment
не могли бы вы продемонстрировать часть своего кода   -  person Ajay Beniwal    schedule 18.12.2013
comment
Почему вам нужно, чтобы посредник зависел от других сервисов? Разве вы не можете просто сделать так, чтобы ваши сервисы зависели от посредника, и после инициализации зарегистрировать обратные вызовы внутри посредника или что-то подобное? Трудно сказать, не зная точно, что вы хотите сделать.   -  person Beyers    schedule 19.12.2013


Ответы (2)


это небольшая проблема, которая выходит за рамки angular и javascript imho.

стандартный способ структурировать посредники, чтобы избежать циклических зависимостей, — это использовать интерфейсы, но в javascript интерфейсов нет.

в вашей ситуации, если у вас медиатор инжектится в сервис и наоборот, да будет ошибка.

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

альтернативой является не использование объекта-посредника, а использование шаблона издателя/подписчика, который встроен в angular с помощью $broadcast и $on. имхо, это дает еще более слабую связь, чем шаблон посредника, так что у меня большой палец вверх

person Anton    schedule 18.12.2013
comment
Что инициализирует посредник, прежде чем он когда-либо будет использоваться с двумя службами, которые вам нужны для посредничества? Есть ли шанс продемонстрировать код? - person poshest; 05.10.2014
comment
@poshest OP попытался внедрить объекты 2 Person в посредник, что не сработало из-за циклической зависимости. обходной путь состоит в том, чтобы иметь что-то вроде функции initMediator(person1, person2), которая инициализирует посредник с двумя объектами, между которыми осуществляется посредничество. - person Anton; 06.10.2014
comment
@Anton, пожалуйста, отредактируйте свой ответ, чтобы он соответствовал реализации но лучше инициализируйте посредник до того, как он будет использован. См. мой вопрос: stackoverflow.com/questions/37889533/ - person Cody; 17.06.2016

Только ваши службы, использующие Mediator, должны зависеть от Mediator. Сервис, который публикует события, внедряет Mediator. Служба, которая подписывается на события, внедряет Mediator и регистрирует обратные вызовы, содержащиеся в службе. Медиатор не должен зависеть ни от одной из служб, он должен содержать только сопоставление событий публикации со списком ссылок обратного вызова.

См. пример Mediator in Angular, который я написал здесь

person SirTophamHatt    schedule 22.08.2014