Skip to main content

Posts

Showing posts from September, 2010

[Flex] PureMVC standard with Spring extensions

由於上次稍微玩了一下 Robotlegs 依賴注入(DI) 主導的 MVC 框架,而著名也使用依賴注入的 Java / Java EE 的 Spring framework 出了 for ActionScript 的版本,剛好在最近 Spring ActionScript 1.0 正式 release 了(想了解 Spring 是啥咪東東的話請自行找 google 大神),這個版本除了基本框架外,也包含了 Cairngorm 與 PureMVC 的外掛...想當然耳,就拿來測試一下用在 PureMVC 內的感覺囉!!

參考了官方範例 中 PureMVC 唯二的範例原始檔,以下使用的是「設定檔依賴注入 facade 透過 addConfigSource() 的方式來 init 」:(其實除了 embed 外,都是外部載入)

Online Demo with source code
工作環境:FlashBuilder, Flex SDK4
請下載 PureMVC Standard 版本再下載 Spring ActionScript 最新版本後,除了 spring-actionscript-cairngorm 不需要外,都放到 /src 下(記得只需要 org 開始...),也別忘了lib 內的 swc 檔 copy 到 /libs 下
Spring 的 injection 並不像 Robotlegs 直接來個 [Inject] metadata 的自動化那樣方便,但是其冷血度(檔案的鬆偶程度)更勝後者!如果你要使用設定檔(applicationContext.xml) 來做注入的話,準備工作就挺多的...XD
依照 applicationContext.xml 內設定的方式分別寫入 constructor 或者是 setter 依賴注入(本範例統一使用 setter injection)為了跟大家都沒關係所以都使用 interface 來處理,所以你會在範例中發現大家都有介面...(並沒有真的研究過 Spring,也許還有其他作法)準備 compiler 時候要用的 classe。由於在 setter, getter 的寫法上都使用 interface,所以真正用到的 class 需要預先在輸出階段就打包到程式內。基本上 PureMVC 類 class 都改為繼承自 IocSi…

Robotlegs AS3 MVC framework in Flex project (II)

這次的範例是兩組 viewComponent 共用同一個 Mediator 外加不同的 instance:
Source code download


要共用的重點就是介面(Interface),所以你會發現這次的兩組 viewComponent 都有實作 IMessageBox
IMessageBox:

public interface IMessageBox
{
function update( newline:String ):void;
}

然後在兩組的 viewComponent 中實作 IMessageBox

<s:Group ....
implements="IMessageBox"
>

<fx:script>
.....
public function update( newline:String ):void{
//IMessageBox interface 實作
data.addItem( newline );
}
.....
</fx:Script>


接下來修改的部份為 MessageBoxMediator

....
[Inject]
public var view:IMessageBox;
//同樣注入屬性...這次記得改成 interface. 因為此 Mediator 為共用
....


接下來在 RobotLegContext startup() 中修改:

....
override public function startup():void
{
//bootstrap here
//auto start, injectViewAs 寫入 viewComponent interface
mediatorMap.mapView( MessageBox, MessageBoxMediator , IMessageBox );
mediatorMap.mapView( MessageBox1, MessageBoxMediator , IMessageBox );
}
....


你會發現 mapView 的 injectViewAs:Class 填入 interface class, 這時候 Robotlegs 的核心在比對 class 的時候才會以 IMessageBox 為主,否則 Mediator 將無法共用,因為在 MessageBoxM…

Robotlegs AS3 MVC framework in Flex project (I)

由於今天在 奶綠茶的 Robotlegs FlashAS3 MVC framework 看到他讚賞 Robotlegs AS3 MVC framework 的好用,不禁好奇的來研究一番...

其實這個 AS3 MVC framework 出現有些時日,但是一直都沒有特別的關注它。簡單看完 Robotlegs 最佳實踐,其實就可以大部分的了解 Robotlegs 運作的邏輯。不如其他的 MVC framework 有很多語言版本, Robotlegs 完全是專注在 AS3 上。也由於僅有一個版本,所以訊息傳遞是利用 AS3 Event 機制來完成,對於一些想要入門實作 MVC 的 Flash 工程師來說絕對是比 pureMVC 好入門很多...=)


Robotlegs 的重點就是搭著「 依賴注入( Dependency Injection) 」達成 MVCS 的架構,  擷取用最佳實踐的中文翻譯解釋:

Quote:
最簡單地, 依賴注入是為對象提供實例變量或屬性的行為. 當你傳遞一個變量到一個類的構造函數, 你在使用依賴注入. 當你設置一個類的屬性, 你在使用依賴注入. 如果你不是使用嚴格的過程或線性方式編寫AS3, 很可能你現在就在使用依賴注入。

呃...依賴注入? ?簡單來講一台霜淇林機,你要賣什麼口味的霜淇林就是依賴不同的原料放置到左右兩個攪拌桶內,而每一個口味可以透過介面實作來達成依賴注入。
以下是簡單的 Dependency Injection 的 Setter injection 範例:

public interface 霜淇淋介面
{
function 擠():void;
}

然後實作:

public class 巧克力 implements 霜淇淋介面{
public function 擠():void{
trace("巧克力口味的霜淇淋");
}
}
public class 草莓 implements 霜淇淋介面{
public function 擠():void{
trace("草莓口味的霜淇淋");
}
}
public class 香草 implements 霜淇淋介面{
public function 擠():void{
trace("香草口味的霜淇淋&quo…