Zuerst habe ich MSMQ noch nie benutzt und meine Antwort wird generell für Mate und Server Kommunikation sein (aufgrund meiner Sicht und 3 Monate Erfahrung).
Zweitens glaube ich nicht, dass Ihre Kommunikationsklassen eine andere eventMap
benötigen.
Überblick über die Struktur meines aktuellen Projekts:
- Ansicht Klassen, verantwortlich nur für die Ansicht Benutzeroberfläche haben wir versucht, alle Anwendungslogik in ihnen nicht enthalten.
- Controller-Klassen, eine große all-seeing
eventMap
und Haufen von Ereignissen. Die eventMap
enthält eine Logik für 'what view.event löst welche model.function'. Es darf KEINE Berechnungen oder andere Anwendungslogik in der 'eventMap' geben.
modelMap
verantwortlich für die Bindung der One-Direction-Verbindung zwischen Modell und Ansicht, beschreiben, was in den View-Klassen (UI) geändert werden muss, wenn etwas im Modell geändert wird. modelMap
DARF NICHT zulassen, dass die Ansichtsklassen Modell direkt manipulieren, es ist gegen Prinzipien von MVC
- Modellklassen - die Klassen für die Anwendungslogik verantwortlich. Auch die Kommunikationsklassen sind da. So etwas wie `ServerCommunicationManager, Klasse Senden von GET/POST/tec Anfragen und anfragende für Antwort
MATE Logik:
1.) wird einige View-Klasse manipuliert und diese Ansicht geschickt ein Ereignis. Beispiel: Benutzer mit Namen und Passwort drücken die Login-Button (RegisterScreen.mxml)
dispatchEvent(new UserRequest(UserRequest.AUTHENTICATION, name, password));
2.) Die eventMap
Instanz empfängt das Ereignis in EventHandler
und ruft eine Methode in der ServerCommunicationManager
Klasse. Beispiel:
<EventHandlers type="{UserRequest.AUTHENTICATION}">
<MethodInvoker generator="ServerCommunicationManager"
method="signUser"
arguments="{[event.name, event.password]}" />
</EventHandlers>
3.) Die Modellklassenmethode wird aufgerufen. Beispiel: mein Beispiel ist gestempelt!
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.Zurück) in den 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>
Und im modelMap
:
<Injectors target="{RegisterScreen}">
<PropertyInjector targetKey="state"
source="{ViewModel}"
sourceKey="state" />
<PropertyInjector targetKey="userName"
source="{UserModel}"
sourceKey="signedUser"/>
</Injectors>
Übersicht: In diesem Ansatz können Sie erfolgreich decopulate Ansicht Klassen von Kommunikationsklassen. Es funktioniert bisher stabil in unserem Projekt.
Edit: Da ich relativ neu zu Mate bin, wenn jemand Fehler in meinem Ansatz sieht, muss er einen Kommentar dazu abgeben. Es ist wirklich wichtig für mich, wenn ein Teil dieser Logik teilweise oder völlig falsch ist.
+1: Danke für die Antwort werde ich versuchen, dies zu tun! Vielen Dank –