2012-02-13 5 views
5

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

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

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

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

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

  • ContactsController действие вызывает ApplicationController.getNextStep (это) и ApplicationController цифры это на следующий шаге от имени ContactsController

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

  • QuoteController переходит в «baton» к ContactController со следующим шагом, который вызывает Контакты ContactController

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

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

Спасибо!

ответ

1

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

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

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

Он мог бы сделать одну из нескольких вещей:

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

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

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

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

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

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

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

1

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

1

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

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

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

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

Смежные вопросы