元々Flexエンジニアだったので、PureMVCには以前から興味があったのだが、以前は時間の問題から諦めていた。PureMVCの本家サイトの情報も中々難解で、正直MVCの構造は理解できるのだが、フレームワークとしての定番の記述がよくわからず、具体的に記述でかなり迷っていた。
そこで改めてソースコードを整理してみた。但し、私のプログラムの記述が合っているとは思わないでほしい。
Main.mxml
[java]
<s:WindowedApplication applicationComplete="facade.startup(this)">
<fx:Script>
<![CDATA[
import com.whoocus.flex.ApplicationFacade;
import mx.events.FlexEvent;
// Initialize the PureMVC Facade
private var facade:ApplicationFacade = ApplicationFacade.getInstance();
]]>
</fx:Script>
[/java]
簡単に言うと、ApplicationFacadeのシングルトンクラスを呼び出す。
そのfacadeクラスのstartupメソッドででアプリをMainを登録して初期化処理が始まる。
ApplicationFacade.as
[java]
public class ApplicationFacade extends Facade
{
/**
* シングルトンのインスタンス生成取得メソッド
*/
public static function getInstance( ) : ApplicationFacade
{
if ( instance == null ) instance = new ApplicationFacade();
return instance as ApplicationFacade;
}
/**
* PureMVC アプリケーションのスタートアップメソッド
*/
public function startup( app:Main ):void
{
registerCommand( AppConstants.STARTUP, StartupCommand);
sendNotification( AppConstants.STARTUP, app );
}
}
[/java]
startupメソッドのregisterCommandで、コマンドクラスを登録しsendoNotification通知を送信する。
StartupCommand.as
[java]
public class StartupCommand extends MacroCommand
{
override protected function initializeMacroCommand():void
{
addSubCommand(PrepareControllerCommand);
addSubCommand(PrepareModelCommand);
addSubCommand(PrepareViewCommand);
}
}
[/java]
StartupCommand内では、とりあえずcontroller/model/view の単位で登録するコマンドを小分けしている。
PrepareControllerCommand.as
[java]
public class PrepareControllerCommand extends SimpleCommand
{
/**
* Command登録処理
*/
override public function execute(notification:INotification):void
{
//Command登録処理
facade.registerCommand(AppConstants.HELLO, HelloCommand);
}
}
[/java]
PrepareControllerCommand.as
[java]
public class PrepareModelCommand extends SimpleCommand
{
/**
* Proxy登録処理
*/
override public function execute(notification:INotification):void
{
//Proxy登録処理
facade.registerProxy(helloProxy);
}
}
[/java]
PrepareViewCommand.as
[java]
public class PrepareControllerCommand extends SimpleCommand
{
/**
* Mediator登録処理
*/
override public function execute(notification:INotification):void
{
//Mediator登録処理
facade.registerMediator(new ApplicationMediator(app));
facade.registerMediator(new HelloMediator(app.greeting));
}
}
[/java]