JointCode.Shuttle,一個簡單高效的跨 AppDomain 通信的服務框架
阿新 • • 發佈:2017-07-17
args 一般來說 code 動態 bsp ati 技術分享 服務組 更多
JointCode.Shuttle 是一個用於 AppDomain 間通信的服務架構。
1. 什麽情況下使用 JointCode.Shuttle
在 .net / mono 開發中,一般不太需要使用額外的 AppDomain,但在一些 特定情況 下,讓代碼運行在新的 AppDomain 中也許是一個好的選擇。
當代碼需要跨越 AppDomain 邊界訪問另一個 AppDomain 時,便產生了跨 AppDomain 通信的問題,JointCode.Shuttle 正是專為此目的而開發的一個服務框架。
2. 為什麽開發 JointCode.Shuttle
一般來說,在進行跨 AppDomain 調用時,大部分人會選擇使用默認提供的 remoting 庫作為底層通信機制。代碼也很簡單,例如:
1 namespace JoitCode.Shuttle.SimpleSample 2 { 3 public class MyService : MarshalByRefObject 4 { 5 public void Do() { } 6 } 7 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 // 在默認 AppDomain 中創建一個子 AppDomain 13 varView CodeserviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null); 14 15 var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap 16 (typeof(MyService).Assembly.FullName, 17 "JoitCode.Shuttle.SimpleSample.MyService"); 18 19 myService.Do();20 21 Console.Read(); 22 } 23 } 24 }
這種方式有什麽問題?
- AppDomain 的訪問是單點的,即它只能由創建它的宿主(或稱父 AppDomain)訪問,而不能由其他 AppDomain 訪問,即使是由相同宿主創建的其他 AppDomain,甚至其宿主的父宿主也不行。
- 缺少靈活性,由於要求服務類必須繼承 MarshalByrefObject 類,這限制了靈活性。
- remoting 庫的架構設計復雜(這一點是由需求決定的,因為 remoting 不僅僅是一個跨 AppDomain 通信組件),從本質來說更適合於進程間通信。事實上,進程間通訊才是它的初衷,AppDomain 之間的通信只是其附帶產生的價值。
- remoting 的性能問題,由於架構設計的復雜性,必然帶來額外的性能開銷,因此它造成的最大問題顯然是兩個 AppDomain 之間訪問的速度太慢(測試結果表明跨 AppDomain 訪問比普通對象訪問慢幾百到一千倍)(示例)
- 雙向通信。remoting 盡管也支持雙向通信,但是服務端如果要調用客戶端的代碼,需要使用事件 / 回調。對於 AppDomain 之間的通訊來說,這不是一種自然的方式。事實上,它采用的還是一種客戶端服務端的思路。
3. JointCode.Shuttle 的特點
與 remoting 相比,JointCode.Shuttle 除了具備相同的跨 AppDomain 通信的功能之外,還有自己的一些特點:
- 面向接口/服務
- 服務可管理:可動態註冊/註銷服務組
- 更好的性能:比 remoting 快 60~70 倍
- 使用 Attribute 方式標註服務,對代碼無侵入
- 強類型,使用方便(remoting 依賴 magic string 來查找服務類)
- 內置 IoC 功能,自動管理服務的依賴項
- 支持延遲加載類型 / 程序集
- 支持訪問任意 AppDomain 的服務
- 簡單,快速上手
- 更自然的、任意 AppDomain 之間的通信(remoting 也可以實現雙向通信,但不那麽自然)
- 可通過租約方式管理遠程服務生命期,也可自行管理
- 支持 .net 2.0
4. 目前的限制
JointCode.Shuttle 是一個非常新穎的框架,現在功能還不是十分完備,盡管作者計劃在未來繼續完善現有功能,並推出更多新的功能,但目前還是存在著一些不足,包括:
- 僅支持 32 位應用程序
- 僅支持 Windows(目前僅支持 .net framework,不支持 mono)
- 暫時不支持事件
- 測試得不夠
5. 如何使用 JointCode.Shuttle
如果您對 JointCode.Shuttle 有興趣,請移步前往 這裏,我們提供了一個簡單的示例來說明如何使用這個框架。
JointCode.Shuttle,一個簡單高效的跨 AppDomain 通信的服務框架