前言
最近有機會了解到了StrangeIoc框架,就拿來跟自己比較熟悉的pureMVC進行一下簡要的對比。這兩套開源框架都是基於MVC模式的擴展,pureMVC是一個跨平台跨語言的MVC輕量級應用框架,它最早是應用在flash開發中,后來經過不斷的發展,現已支持幾乎所有的平台,當然在unity開發中應用也很廣泛;StrangeIoc是一款基於MVCS的框架,專門C#和Unity而設計,可以直接在Asset Store下載。
pureMVC介紹
pureMVC框架示意圖


在MVC模式中,應用程序被分為低耦合的三層:Model、View和Controller。PureMVC在此基礎上有所擴充,通過模塊化設計,可以進一步降低模塊間的耦合度,創建了一個易於擴展限制很小的通用框架。
PureMVC源碼分析
1、核心層中是三個單例類:
Model:保存對Proxy對象的引用,Proxy負責操作數據類型
View:保存對Mediator對象的引用,Mediator負責操作具體的視圖組件
Controller:保存所有Command的映射,Command執行相關命令。
在實際開發中,你根本不需要關心這三個類,只需調用Facade類的GetInstance方法即可啟動pureMVC框架,Facade會自動幫你初始化MVC環境。
2、框架內部通訊:
pureMVC內部通訊是基於Observer/Notification 機制(觀察者模式)來實現的,只需要使用一個非常簡單的方法從 Proxy,Mediator, Command 和 Facade 發送 Notification。
3、Facade:
這是pureMVC提供的與核心層通訊的單例類,它負責初始化Model、View、Controller,Proxy、Mediator 和 Command 就可以通過創建的 Facade 類建立起通信機制。
4、Mediator
Mediator(中介) 對應MVC中的View.,在實際應用中,Mediator經常與view是綁定的關系, Mediator可以監聽View Component發出的Event,開發時,在ListNotificationInterests方法中添加自己關心的Notification, 當關心的Notification發出時, 會執行Mediator的HandleNotification方法中,在這個方法中需要對Notification做處理。Mediator既可以發送通知,也可接收通知。
5、Proxy
Proxy通常情況下會暴露一組公共API供Controller(command)或View(mediator)調用,用來對數據進行增刪改查。在pureMVC的設計中,proxy只可以發出Notification,而不能接收Notification
6、Command
command與Notification是一一對應的,注冊Command時,會將Notification與對應Command進行綁定,當該Notification發出時,對應command就會執行它的Excute方法。puremvc中有兩種Command:第一種是SimpleCommand ,只有一個 execute 方法,execute 方法參數是一個Inotification 實例。實際應用中,你只需要重寫這個方法就行了。第二種是MacroCommand,讓你可以順序執行多個 Command。實際應用中,你需重寫這個方法。
pureMVC特點:
1、pureMVC巧用了幾種設計模式:代理模式 、觀察者模式 、中介者模式 、命令模式 、單例模式 。
2、使Model、View、Controller之間耦合降低,但也容易造成了代碼冗余量大。
3、pureMVC將Observer/Notification保存在字典中,Notification的傳遞也都要經過裝箱拆箱操作,如果在大型項目中使用pureMVC可能會影響性能。
StrangeIoc介紹
框架簡介
StrangeIoc 是一個基於MVCS的框架,支持依賴注入。網上很多博文都說strangeIoc是一個依賴注入框架,其實這種說法是不夠正確的,這個框架的核心,是綁定。strangeIoc的核心內容就是對綁定進行了包裝,可以綁定一個接口到它的實體類上面。或者綁定一個事件到一個處理者上。或者綁定兩個類:當一個被實例化時,自動創建另一個的實例。
IOC也被成為控制反轉,在StrangeIOC與許多框架通常用這種技巧實現一個ioc容器,將代碼內的依賴關系交給第三方(IOC容器)管理,通過容器來實現對象組件的裝配和管理。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了內部的容器。需要什么類型告訴工廠你要的類型,他會生產給你一個實例,簡而言之我們可以看作是一個用來new類型的工廠 。
starngeIoc框架示意圖


Root(contexView):根節點,繼承自MonoBehavior ,創建一個MVCS Context,是MVCS架構的入口。
MVCS Context :進行view與mediator,services接口與實現該接口的類的綁定等。
CONTROLLER:大部分邏輯處理放在這一層,連接VIEW和SERVICES,MODELS層,起到數據總管理的作用。
VIEW:一切用戶可以看到的,均在這一層。細分為view和mediator(中間層),UI和數據分離,view負責顯示畫面,mediator通過Dispatcher發送數據請求,與CONTROLLER層進行交互,起到數據交流中轉站的作用。
SERVICES層:服務層,客戶端的數據通過SERVICES層與外界交互,連接服務器取得數據。基本上與服務器的數據交流均通過SERVICES層完成。
WEB:服務器
MODEL:數據模型
綁定(Binding)
strange的核心是綁定,綁定的工作都會放在MVCSContext中做, strange的binding由兩個必要部分和一個可選部分組成,必要部分是a key and a value key觸發value,比如一個事件可以觸發回調,一個類的實例化可以觸發另一個類的實例化。可選部分是name。
綁定可以分為injectionbinding ,commandbinding,mediationbing這三種,注入綁injectionbinding主要是用來綁定該類型對象到上下文,這樣使得程序中各個地方可以通過contextview訪問得到該對象;commandbinding是為了將事件或信號與命令綁定;mediationbing是將view注入中介mediator中。


注入(Inject)
注入的功能,就是我們想獲得某種類型的對象時不需要自己去創建,只要加上[Inject]標識就可以根據你bind時的規則獲得對象,根據這些Inject標識,框架會找到這些屬性,通過類型判斷按Context中注冊的規則將對象的實例賦值給該屬性。
框架內部通訊
StrangeIOC提供的通訊方式有兩種 :一種是IEvent傳遞,還有一種是通過Signal傳遞,這兩種方式,我們實際開發時使用一種即可,使用IEvent的好處是自己可以繼承此接口自己實現自定義的消息體,缺點是每次接收到消息的時候都是以IEvent接口的形式,這是一種類型不安全的做法,同時也會造成不必要的性能損耗。Signal是StrangeIOC框架成熟后提供的,Signal的好處是強類型 ,類型安全也不需要強轉,你只需要在接收的地方Inject屬性即可,目前,大家開發時都使用signal的方式比較多。
總結
pureMVC與strangeIoc都是非常適合unity項目開發,pureMVC框架足夠簡單,源碼除去注釋行總共才600多行,看懂源碼也不是什么難事,有興趣的朋友可以去下載研究
https://github.com/PureMVC/puremvc-csharp-standard-framework
,在實際開發中,我們通常也會對pureMVC框架進行擴展,比如加入Service模塊,負責與服務器通訊,這也是很方便能實現,同時,針對pureMVC的性能問題,網上也能找到一些優化的方案,pureMVC可擴展性是很強的。strangeIoc框架上手會比strangeIoc困難一些,就像它的名字一樣,使用起來確實很奇怪,項目開發中會涉及各種事件和信號調用,調試起來會比較麻煩。框架的作者介紹這是一款輕量級的框架,但這框架的源碼有兩萬多行,這可不算輕量,我看了幾眼框架的源碼就腦闊痛,但不可否認它確實是一款優秀的框架,通過依賴注入,event&signal傳遞的方式,大大降低模塊之間的耦合,使用起來也很靈活,據我所知騰訊有很多上線項目都用到了這個框架,地址
https://github.com/strangeioc/strange-core
。至於在開發時使用哪個框架比較好,這還得看實際情況,但顯然pureMVC使用起來成本更低。