首先,我从未使用过 MSMQ,我的回答通常是针对 Mate 和服务器通信(由于我的观点和 3 个月的经验)。
其次,我认为您的通信类不需要另一个eventMap
.
我当前项目的结构概述:
- 视图类,只负责显示用户界面,我们试图不包含任何应用程序逻辑。
- 控制器类,一个大的全能
eventMap
事件和一堆事件。“什么 view.event 触发什么 model.function”的eventMap
包含逻辑。“eventMap”中必须没有计算或其他应用程序逻辑。
modelMap
负责绑定模型和视图之间的单向链接,描述当模型中的某些内容发生更改时视图类(UI)中必须更改的内容。modelMap
绝不能允许视图类直接操作模型,这违反了 MVC 的原则
- 模型类 - 负责应用程序逻辑的类。通讯类也在那里。类似`ServerCommunicationManager,发送GET/POST/tec请求和请求响应的类
配合逻辑:
1.)一些视图类被操纵,这个视图发送了一些事件。示例:具有名称和密码的用户按下登录按钮(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>
概述:在这种方法中,您可以成功地将视图类与通信类分离。到目前为止,它在我们的项目中运行稳定。
编辑:由于我对 Mate 比较陌生,如果有人在我的方法中发现错误,他必须对此发表评论。如果某些逻辑部分或完全错误,对我来说真的很重要。