Во-первых, я никогда не использовал MSMQ, и мой ответ будет, как правило, для общения с Mate и сервером (из-за моей точки зрения и 3-месячного опыта).
Во-вторых, я не думаю, что ваши классы общения нуждаются в другом eventMap
.
Обзор структуры моего текущего проекта:
- просмотр классов, отвечающих только за отображение пользовательского интерфейса, мы постарались не включать в них логику приложения.
- классы контроллеров, один большой всевидящий
eventMap
и куча событий. eventMap
включает логику для «what view.event запускает то, что model.function». В EventMap не должно быть НИКАКИХ вычислений или другой логики приложения.
modelMap
отвечает за привязку однонаправленной связи между моделью и представлением, описывая, что должно измениться в классах представления (UI), когда что-то изменяется в модели. modelMap
НЕ ДОЛЖЕН позволять классам представления напрямую манипулировать моделью, это противоречит принципам MVC
- модель классов - классы, отвечающие за логику приложения. Также есть классы общения. Что-то вроде `ServerCommunicationManager, класс, отправляющий запросы GET / POST / tec и запрашивающий ответ
логика MATE:
1.) Некоторым классом View манипулируют, и это представление отправляет какое-то событие. Пример: пользователь с именем и паролем нажимает кнопку входа (RegisterScreen.mxml)
dispatchEvent(new UserRequest(UserRequest.AUTHENTICATION, name, password));
2.) Экземпляр eventMap
получает событие в EventHandler
и вызывает некоторый метод в классе ServerCommunicationManager
. Пример:
<EventHandlers type="{UserRequest.AUTHENTICATION}">
<MethodInvoker generator="ServerCommunicationManager"
method="signUser"
arguments="{[event.name, event.password]}" />
</EventHandlers>
3.) Метод класса модели вызывается. Пример: мой пример заглушен!
public function signUser(user:String, password:String):void
{
var passwordEncoded:String = encodePassword(password);
var jsonMessage:Object = new Object();
jsonMessage.type = "checkUser";
jsonMessage.name = name;
jsonMessage.password = passwordEncoded;
sendGetRequest(serverIP, json, receiveResponseHandler);
}
public function receiveResponseHandler(response:Object)
{
var userDetails:UserDetails = decodeJsonToUser(response);
if(userDetails is NoUser)
{
FlexGlobals.topLevelApplication.dispatchEvent(new ServerResponseEvent(ServerResponseEvent.NO_USER));
}
else if(userDetails is NormalUser)
{
FlexGlobals.topLevelApplication.dispatchEvent(new ServerResponseEvent(ServerResponseEvent.NORMAL_USER, userDetails));
}
else if(userDetails is Administrator){...} else ...
}
4.) Назад в EventMap
<EventHandlers type="{ServerResponseEvent.NORMAL_USER}">
<PropertySetter generator="UserModel"
targetId="signedUser"
source="{event.userDetails}"/>
</EventHandlers>
<EventHandlers type="{ServerResponseEvent.NoUser}">
<PropertySetter generator="UserModel"
targetId="signedUser"
source="null"/>
<PropertySetter generator="ViewModel"
targetId="state"
source="loginDenied"/>
</EventHandlers>
А в modelMap
:
<Injectors target="{RegisterScreen}">
<PropertyInjector targetKey="state"
source="{ViewModel}"
sourceKey="state" />
<PropertyInjector targetKey="userName"
source="{UserModel}"
sourceKey="signedUser"/>
</Injectors>
Обзор. При таком подходе вы можете успешно отделить классы представления от классов связи. Пока он работает стабильно в нашем проекте.
Редактировать: Поскольку я относительно новичок в Мате, если кто-то видит ошибки в моем подходе, он ДОЛЖЕН сделать комментарий об этом. Для меня действительно важно, если какая-то часть этой логики частично или полностью неверна.