Межконтроллерная связь в MVC / MVP - PullRequest
5 голосов
/ 14 февраля 2012

Каков хороший метод для слабосвязанной связи между контроллерами в MVC / MVP?

Например, в цитате пользователь должен создать и добавить новый контакт или добавить существующий.

Они решили создать новый контакт. По завершении контакт добавляется в предложение, и пользовательский интерфейс возвращает пользователя в это предложение. Если они нажимают кнопку отмены, они возвращаются в цитату.

Я хочу повторно использовать Контакт в другом месте, поэтому он не должен ничего знать о Цитате. Например, если я создаю контакт из списка контактов, он должен вернуться туда после завершения.

Вот несколько вариантов, о которых я подумал:

  • Действие ContactsController вызывает ApplicationController.getNextStep (this), и ApplicationController выясняет следующий шаг от имени ContactsController

  • ContactsController вызывает событие «actioncomplete» или подобное, и ApplicationController прослушивает это событие и вызывает правильный следующий шаг

  • QuoteController передает «эстафету» в ContactsController со следующим шагом, который ContactsController вызывает по завершении

  • ContactsController вызывает событие «actioncomplete» или подобное, и QuotesController прослушивает это событие и вызывает правильный следующий шаг.

У вас есть опыт с этим? Другие идеи? Что вызовет наименьшую головную боль в большом приложении?

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Вы могли бы реализовать некоторую форму стека навигации, в которой сначала в него вставляются контроллеры Quote или Contacts, а затем они при необходимости вставляют в него контроллер Contact. Когда Контроллер контактов готов, он отключается и запускает следующий, чтобы узнать, куда идти. Таким образом, он полностью отделен и может быть использован везде, и может быть вложен на n уровней глубиной.

1 голос
/ 23 февраля 2012

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

Ваша идея функции обратного вызова очень хорошая, но я бы пошел дальше и сделал ее Func <> , позволяющей использовать замыкания. Я расширю метафору вашего консультанта: вместо того, чтобы передавать номер телефона вашему представителю, вместо этого попросите его вернуться в офис и получить оттуда инструкции. Прелесть использования замыканий в том, что вы можете получить доступ к вызывающему контексту непосредственно из кода, в противном случае он выходит за рамки; другими словами, замыкание может обращаться к всем переменным и функциям в хост-контроллере.

Когда ваш продавец выполнит свою задачу, он просто откроет свой портфель (Func <>) и достанет до своего стола в офисе , чтобы посмотреть, положил ли кто-нибудь предмет To-Do в свой офис. выдвижной ящик.

У Джона Скита (также в StackOverflow) есть отличный ресурс: http://csharpindepth.com/articles/chapter5/closures.aspx

1 голос
/ 20 февраля 2012

Думаю, я отвечу на свой вопрос.Надеюсь, я получу эту милую, сладкую награду.

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

Иногда его босс отсылает его.Иногда генеральный директор (он может не знать, куда его отправить после).Иногда клиент вызывает его срочно (он точно не знает, куда его отправить).Иногда он просто берет новое задание с доски.

Он может сделать одну из следующих вещей:

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

  • вы можете сказать ему, что делать, когда он закончит, прежде чем он уйдет.если он уйдет на некоторое время, его следующее задание могло бы измениться за это время.

  • вы могли бы сказать ему, чтобы он отправил на фейсбук, когда он закончит, головной офис будет искать его и скажет ему, что делать.Головной офис должен будет следить за большим количеством постов в Facebook от всех своих консультантов.

  • вы можете сказать его начальнику, чтобы он ответил на его звонок, когда он закончил, но тогда его руководитель долженбыть в офисе, и, возможно, он сменит начальников.

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

Это было бы равносильно предоставлению консультанту номера следующего клиента, который позвонит, когда он закончит.Если он не получает номер, он звонит в головной офис.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...