まず、私は MSMQ を使用したことがなく、私の答えは一般的に Mate とサーバーの通信に関するものです (私の視点と 3 か月の経験による)。
第二に、あなたの通信クラスには別の が必要だとは思いませんeventMap
。
現在のプロジェクトの構造の概要:
- ユーザー インターフェイスの表示のみを担当するビュー クラスにアプリケーション ロジックを含めないようにしました。
- コントローラ クラス、1 つの大きなすべてを
eventMap
見渡せるイベントの束。eventMap
「どのview.eventがどのmodel.functionをトリガーするか」のインクルードロジック。「eventMap」には、計算やその他のアプリケーション ロジックがあってはなりません。
modelMap
モデルとビューの間の一方向リンクをバインドし、モデルで何かが変更されたときにビュー クラス (UI) で何を変更する必要があるかを説明します。modelMap
ビュー クラスがモデルを直接操作することを許可してはなりません。MVC の原則に反します。
- モデル クラス - アプリケーション ロジックを担当するクラス。通信講座もあります。`ServerCommunicationManager のようなもので、GET/POST/tec 要求を送信し、応答を要求するクラス
メイトロジック:
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に比較的慣れていないので、誰かが私のアプローチに誤りを見つけた場合、彼はそれについてコメントしなければなりません. このロジックの一部が部分的または完全に間違っているかどうかは、私にとって非常に重要です。