Service層の解説です。
この層では
1)Serviceパッケージ
2)Delegateクラス
で構成されています。
1)
Serviceパッケージに配置されるクラスは
ServiceLocatorタグを持ったMXMLである
ApplicationService.mxmlのみです。
これはCairngormがHTTPServiceやRemoteObjectといった
「サーバサイドとの連携の入り口を1つにしてしまおう」
との意図があります。
サーバサイドとの連携はHTTPServiceやRemoteObjectを利用しますが、
それらを管理しているのが、このApplicationService.mxmlファイルです。
中身を見て見ましょう。
<?xml version="1.0" encoding="Shift_JIS"?>
<ServiceLocator xmlns="com.adobe.cairngorm.business.*" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・①
xmlns:mx="http://www.adobe.com/2006/mxml"
>
<mx:Script>
<![CDATA[
/** サービスを取得するためのインスタンス名を定義します。
* ここで定義する名称と下記<mx:HTTPService>タグのIDが一致しないと、
* HTTPServiceのインスタンスは取得できませんので気をつけてください。
**/
public static const APPLICATION_HTTP_SERVICE_NAME:String = "appHttpService"; ・・・・②
]]>
</mx:Script>
<mx:HTTPService id="appHttpService" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③
result="event.token.resultHandler(event)"
fault="event.token.faultHandler(event)"
method="POST"
showBusyCursor="true"
/>
</ServiceLocator>
①ServiceLocatorタグ
③にて記述されるHTTPServiceをCairngormが管理するために用意されたタグが
このServiceLocatorです。
このタグの中で宣言されたHTTPServiceやRemoteObjectタグは
ServiceLocatorクラスより取り出すことができます。
例)
var httpSrv:HTTPService = ServiceLocator.getInstance().getHTTPService("appHttpService");
②public static const APPLICATION_HTTP_SERVICE_NAME
ここで宣言されているpublic static constの文字列は
③で記述されているHTTPServiceタグ(あるいはRemoteObjectタグ)のIDの文字列と
一緒である場合が必要です。
上記①で記したようにServiceLocatorからHTTPServiceあるいはRemoteObjectを取り出す際に、
ServiceLocatorタグの中で宣言したHTTPServiceタグ(あるいはRemoteObjectタグ)のIDを用いて、
ServiceLocatorタグから取り出すからです。
このIDは外部からのアクセス(例えばDelegateクラスからのアクセス)ではIDを
取得することが難しいです。
しかし、public static constとして宣言しておけば、
わざわざタグのIDを調べなくても、この宣言を利用するだけで取り出せるようになるからです。
ですので、必ず宣言しましょう。
③HTTPServiceタグ
HTTPServiceを行うタグです。
resultにはevent.token.resultHandler(event)
faultにはevent.token.faultHandler(event)
と指定されていますが、これはDelegateの中で使う際に指定するもので、
IResponderのresultメソッドとfaultメソッドがそれぞれ関連付けされるようになっています。
詳しくはDelegateの解説をご覧ください。
2)
DelegateクラスはHTTPServiceやRemoteObject等、サーバサイドと連携を行うためのクラスです。
Cairngormではこの
「Delegate以外ではサーバサイドとの連携ロジックは組み込まない」
というルールになっています。
では、サンプルのDelegateクラスを見てみましょう。
package sample.service.samplecairngorm
{
import mx.rpc.IResponder;
import mx.rpc.http.HTTPService;
import com.adobe.cairngorm.business.ServiceLocator; ・・・・・・・・・・・・・・・・・・・・・①
import sample.service.ApplicationService;
/**
* サーバと連携するためのクラスです。
*/
public class SamplecairngormHttpDelegate
{
private var _responder:IResponder;
private var _httpService:HTTPService;
/**
* コンストラクタです。
* @param callingCommand サービス実行結果を返却する先を示すオブジェクトIResponderです。
*/
public function SamplecairngormHttpDelegate(callingCommand:IResponder) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・②
{
// ApplicationServicecからHTTPServiceのインスタンスを取得します。
_httpService = ServiceLocator.getInstance().getHTTPService(ApplicationService.APPLICATION_HTTP_SERVICE_NAME);
// 返却オブジェクトを保持します。
_responder = callingCommand; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③
}
/**
* Commandクラスから呼び出されるサーバ連携用メソッドです。
* @param o サーバーに渡したい値などを入れたObjectクラスです。
*/
public function clickBtnHelloWorld(o:Object):void ・・・・・・・・・・・・・・・・・・・・・・・・・・④
{
// 返却オブジェクトのTOKENを指定するため、一時的にObject型に変換しています。
var service:Object = _httpService;
// URLを指定します。
_httpService.url = "./hello.xml";
// アクセスした結果をserviceに返却し、そのserviceのresultHandlerとfaultHandlerのtokenに設定します。
service = _httpService.send();
service.resultHandler = _responder.result;
service.faultHandler = _responder.fault; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑤
}
}
}
①インポート文
Delegateクラスでは、サーバサイドとの連携結果を返すためのオブジェクト設定のためにIResponderを、
サーバサイドとの連携をするためのクラス保持のためにHTTPService(あるいはRemoteObject)クラスを
そしてCairngormの中で管理されたHTTPServiceあるいはRemoteObjectを取得するためにServiceLocatorクラスを
それぞれインポートしています。
②コンストラクタ
コンストラクタの引数としてIResponderを受け取っていますが、
これはHTTPServiceやRemoteObjectのメソッドを実行した結果を返すオブジェクトを
設定するためです。
このIResponderに指定されたresultメソッドあるいはfaultメソッドに
サーバサイドの実行結果が返却されるようになっています。
③サーバサイド連携オブジェクトの取り出しと返却オブジェクトの設定
ServiceLocatorからHTTPServiceあるいはRemoteObjectを取り出しています。
また引数として受け取ったcallingCommandを
インスタンス変数に設定しています。
このことにより、サーバサイドのサービス実行結果がcallingCommandのresultメソッドあるいはfaultメソッドに
返却されるようになります。
④サーバサイド連携メソッド
実際にサーバサイドと連携するためのメソッドです。
Commandのexecuteメソッドの中でこのメソッドが呼び出されることでしょう。
引数として渡されているObjectクラスは
HTTPServiceやRemoteObjectに渡すリクエストのパラメータを持ったObjectです。
例として
_httpService.request = o;
と使えると思います。
⑤返却先の再設定
実際に取り出されたHTTPServiceあるいはRemoteObjectの結果ハンドラを設定しているのがこの部分です。
service.resultHandler = _responder.result;
service.faultHandler = _responder.fault;
とサービスオブジェクトのそれぞれのハンドラに設定していることがわかります。
※サーバサイド連携メソッドの中でプログラムで意識しなければいけないところは
service.url
か
service.request
のどちらかになります(HTTPServiceの場合)
それ以外のコーディングはお約束として必ず記述をしてください。
そうでないとうまくIResponderに返却されません。
以上がService層の解説です。
Service層もDelegateが少々、特殊なことをしていますが、
ここはひとつお約束の構文ということで。
最終更新:2008年08月20日 16:17