1. 程式人生 > >JointCode.Shuttle,一個簡單高效的跨 AppDomain 通信的服務框架

JointCode.Shuttle,一個簡單高效的跨 AppDomain 通信的服務框架

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             var
serviceDomain = 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 }
View Code

這種方式有什麽問題?

  • AppDomain 的訪問是單點的,即它只能由創建它的宿主(或稱父 AppDomain)訪問,而不能由其他 AppDomain 訪問,即使是由相同宿主創建的其他 AppDomain,甚至其宿主的父宿主也不行。
  • 缺少靈活性,由於要求服務類必須繼承 MarshalByrefObject 類,這限制了靈活性。
  • remoting 庫的架構設計復雜(這一點是由需求決定的,因為 remoting 不僅僅是一個跨 AppDomain 通信組件),從本質來說更適合於進程間通信。事實上,進程間通訊才是它的初衷,AppDomain 之間的通信只是其附帶產生的價值。
  • remoting 的性能問題,由於架構設計的復雜性,必然帶來額外的性能開銷,因此它造成的最大問題顯然是兩個 AppDomain 之間訪問的速度太慢(測試結果表明跨 AppDomain 訪問比普通對象訪問慢幾百到一千倍)(示例)
  • 雙向通信。remoting 盡管也支持雙向通信,但是服務端如果要調用客戶端的代碼,需要使用事件 / 回調。對於 AppDomain 之間的通訊來說,這不是一種自然的方式。事實上,它采用的還是一種客戶端服務端的思路。

3. JointCode.Shuttle 的特點

與 remoting 相比,JointCode.Shuttle 除了具備相同的跨 AppDomain 通信的功能之外,還有自己的一些特點:

  1. 面向接口/服務
  2. 服務可管理:可動態註冊/註銷服務組
  3. 更好的性能:比 remoting 快 60~70 倍
  4. 使用 Attribute 方式標註服務,對代碼無侵入
  5. 強類型,使用方便(remoting 依賴 magic string 來查找服務類)
  6. 內置 IoC 功能,自動管理服務的依賴項
  7. 支持延遲加載類型 / 程序集
  8. 支持訪問任意 AppDomain 的服務
  9. 簡單,快速上手
  10. 更自然的、任意 AppDomain 之間的通信(remoting 也可以實現雙向通信,但不那麽自然)
  11. 可通過租約方式管理遠程服務生命期,也可自行管理
  12. 支持 .net 2.0


4. 目前的限制

JointCode.Shuttle 是一個非常新穎的框架,現在功能還不是十分完備,盡管作者計劃在未來繼續完善現有功能,並推出更多新的功能,但目前還是存在著一些不足,包括:

  1. 僅支持 32 位應用程序
  2. 僅支持 Windows(目前僅支持 .net framework,不支持 mono)
  3. 暫時不支持事件
  4. 測試得不夠

5. 如何使用 JointCode.Shuttle

如果您對 JointCode.Shuttle 有興趣,請移步前往 這裏,我們提供了一個簡單的示例來說明如何使用這個框架。

JointCode.Shuttle,一個簡單高效的跨 AppDomain 通信的服務框架