Взаимодействие с шиной выделенной области
Примеры, которые мы рассматривали до настоящего времени, решали некоторые конкретные проблемы. Эти примеры были способны принять небольшие входные данные от хост-приложения и обеспечить некоторые полезные преимущества. В большинстве случаев выделенной области необходимо программно взаимодействовать с хост-приложением, и вместо того, чтобы оставить создание метода взаимодействия за каждым из разработчиков, в MvcContrib проект встроен простой, но эффективный механизм: шина сообщений. Шина была создана для того, чтобы позволить механизму синхронной передаче отправлять и принимать сообщения, которые определяет выделенная область. Далее мы пройдемся по примеру использования шины сообщений.
Пример использования шины сообщений MvcContrib
В качестве примера давайте будем использовать область RssWidget
из предыдущего раздела. Эта область всего лишь предоставляла пользовательский интерфейс для отображения RSS-новости, но не предоставляла никакого механизма для извлечения данных из новости. Шина позволяет выполнять поиск данных и отправлять их обратно в область для отображения.
Давайте рассмотрим то, как сообщение отправляется из выделенной области. Ниже представлен вызов, необходимый для отправки сообщения вдоль шины:
MvcContrib.Bus.Send(new RssWidgetRenderedMessage{Url = RssUrl});
Данный пример демонстрирует то, как однонаправленное сообщение отправляется в приложение, указывая на регистрацию намерений.
Для того чтобы сообщение было получено, хост-приложению необходимо зарегистрировать обработчик, подобный данному:
MvcContrib.Bus.AddMessageHandler(typeof(RssMessageHandler));
Регистрация обработчика сообщений – это однострочный вызов, который должен возникать один раз при старте приложения. Шина будет хранить путь обработчиков и сообщений, а также удостоверяться в том, что обработчики вызываются там, где это необходимо.
Более интересный код – это класс RssMessageHandler
. Каждый обработчик сообщения должен быть реализован в хост-приложении. Обработчики должны предполагать код интеграции, который переплетает вместе выделенную область и хост-приложение. Это означает, что код обработчика должен быть минимизирован, и что он полагается на сервисные классы приложения, а не на реализацию логики внутри класса обработчика.
Следующий листинг демонстрирует шаблонный код, необходимый для реализации обработчика сообщений для сообщения, использующего шину.
Листинг 19-11: Класс обработчика сообщений
using MvcContrib.PortableAreas;
using RssWidgetPortableArea.Controllers;
namespace RssWidgetPortableArea
{
public class RssMessageHandler : MessageHandler<RssWidgetRenderedMessage>
{
public override void Handle(RssWidgetRenderedMessage message)
{
//log the message to the applications log.
}
}
}
Внутри метода Handler
вы можете реализовать обращения к сервисам и хранилищу данных вашего приложения.