Тайфун: получите экземпляр класса, построенный на Тайфуне, независимо от Тайфуна.

При интеграции раскадровки Typhoon все, что необходимо для внедрения зависимостей, — это использовать макросы автоматического внедрения или методы сборки для внедряемого класса.

Однако в другом месте необходимо попросить Typhoon построить экземпляр для нас. Есть ли способ получить экземпляр без зависимости моего класса от Typhoon?


person Jasper Blues    schedule 18.07.2015    source источник


Ответы (1)


Да, в духе внедрения зависимостей Typhoon спроектирован так, что никакие пользовательские классы не должны иметь прямую зависимость от Typhoon.

Допустим, вы хотите получить экземпляр ViewControllerB из ViewControllerA в приложении Typhoon. Для этого мы создаем наше определение для ViewControllerA таким образом, чтобы внедрялась сборка, а затем просим сборку построить экземпляр. Это показано в примере приложения и подробнее в руководстве пользователя здесь.

Следующий шаг, если вы хотите полностью отделить свои классы приложений от Typhoon, состоит в том, чтобы просто поддержать свои сборки протоколом и внедрить его. Таким образом, все, что видит ваше приложение, — это интерфейс поставщика для контроллера представления класса, необходимого A для выполнения своей работы. Вот руководство, как это сделать.

person Jasper Blues    schedule 18.07.2015
comment
Но Джаспер, каким-то образом ViewControllerA должен быть внедрен в сборку, в примере я видел, что единственный способ сделать это — сделать ViewControllerA контроллером корневого представления, введенным в AppDelegate, но если ViewControllerA не является контроллером корневого представления (например, это просто контроллер представления, нажимаемый другим контроллером представления), тогда мне пришлось бы явно вызывать [[MyAssembly new] активировать], а затем получать ViewControllerB с его внедренными зависимостями, я прав? В вики-примере, если я создаю экземпляр FriendListViewController с помощью initWithNibName, я считаю, что провайдер не будет внедрен. - person fernandospr; 18.07.2015
comment
Обычно вы никогда не вызывали бы [[MyAssembly new] activate], если вы уже загружаете Typhoon с помощью интеграции с plist — это создаст новый экземпляр Typhoon. . что касается внедрения сборки - ее можно внедрить куда угодно, а не только в AppDelegate или RootController, как в примерах приложений. - person Jasper Blues; 19.07.2015
comment
Я загрузил здесь простой проект, чтобы продемонстрировать свою проблему: github.com/fernandospr/TyphoonNoStoryboardExample. см. имя свойства ViewControllerC не вводится. Я загружаю Typhoon, используя интеграцию с plist, и не уверен, что делаю неправильно, можете ли вы проверить? - person fernandospr; 19.07.2015
comment
Какую часть ответа вы не поняли? Или я неправильно понял ваш вопрос? - person Jasper Blues; 20.07.2015
comment
Я просто не могу внедрить сборку или что-либо еще в контроллер представления без использования раскадровки, пожалуйста, проверьте небольшой пример github, если можете. Вы увидите три контроллера представления и сборку, пытающуюся внедрить свойство в один из них. Просто не работает и не могу понять почему. - person fernandospr; 20.07.2015
comment
Я думаю, вам лучше опубликовать свой код вместе с вопросом, поскольку ссылка на отдельный проект на самом деле не соответствует формату StackOverflow. Модераторам SO нравится: а) другие пользователи получат пользу от вопроса в будущем б) разумное количество исследований и усилий со стороны тех, кто просит решить проблему - person Jasper Blues; 20.07.2015
comment
Опубликовал проблему в новом вопросе: stackoverflow. ком/вопросы/31507439/ - person fernandospr; 20.07.2015