使用flex 4(MATE MVC)和MSMQ进行集成

时间:2011-01-14 15:22:15

标签: flex actionscript-3 integration msmq mate

我正在做一个空中应用程序(flex4),因为这是我的第一个应用程序,我需要一些建议来进行集成部分。

我的系统和后端之间的所有集成都必须使用MSMQ来完成,好吧,我听说过一些我可以在我的flex项目中导入的库,用于在MSMQ队列中放入和读取消息,但这不是我的doublet,我想知道,它是如何做这种通信的好方法,我的意思是,我应该有一个actionscript类,例如调用MSMQService,在那里,我应该有放入和读取的函数队列?或者我应该在Mate中创建一个新的自定义标签,还有单独的eventMap来处理集成?!我知道有很多方法,但如果有人已经这样做了,我想知道你是怎么做的,就像一些好的模式。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

首先,我从未使用MSMQ,我的答案通常是Mate和服务器通信(由于我的观点和3个月的经验)。

其次,我认为您的沟通课程不需要另一个eventMap

我当前项目的结构概述:

  • 查看类,仅负责显示用户界面,我们尝试不在其中包含任何应用程序逻辑。
  • 控制器类,一个大看见eventMap和一堆事件。 eventMap包含'what.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>

概述:在这种方法中,您可以成功地从通信类中减少视图类。到目前为止,它在我们的项目中运行稳定。

编辑:由于我对Mate相对较新,如果有人看到我的方法有误,他必须对此发表评论。如果某些逻辑部分或完全错误,对我来说非常重要。