使用 JointCode.Shuttle 管理遠程服務對象的生命期

JointCode.Shuttle 是一個用於進程內 AppDomain 間通訊的服務架構(不支持跨進程),它旨在取代運行時庫提供的 MarshalByrefObject 的功能。git

 通常狀況下,在進行跨 AppDomain 調用時,大部分人選擇使用運行時庫默認提供的、基於 MarshalByrefObject 類繼承的通訊機制。代碼也很簡單,例如:github

 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 }

使用這種方式來調用遠程(位於其餘 AppDomain 的)服務,簡單當然簡單,但它不提供遠程服務管理功能。也就是說,調用者沒法控制什麼時候釋放遠程服務對象。架構

假如遠程服務對象只是提供簡單的服務,這原本也沒什麼問題。但若是遠程服務可能會被頻繁調用呢?又或者遠程服務持有關鍵系統資源(於是須要及時釋放)呢?測試

前一種狀況可能會形成服務端內存消耗增長,然後一種狀況則可能形成系統瓶頸。spa

使用 JointCode.Shuttle 能夠避免上述狀況的發生,由於它容許客戶端自主釋放遠程服務對象,或者也可使用租約來管理遠程對象的生命期。並且,若是遠程對象實現了 IDisposable 接口,則其 Dispose 方法還會被調用(注意,若是服務被定義爲單例,即在對服務類應用 ServiceClassAttribute 時將其 Lifetime 屬性設爲 LifetimeEnum.Singleton,則要到應用程序結束時纔會釋放其服務實例並調用其 Dispose 方法)。code

使用方法相似以下所示:對象

    IRemoteLifetimeService lifetimeService;

    // 獲取遠程服務實例
    // _shuttleDomain 是一個 ShuttleDomain 實例對象
    _shuttleDomain.TryGetService(out lifetimeService);

    // 調用遠程服務方法
    lifetimeService.Execute();

    // 遠程服務對象會被釋放
    lifetimeService.Dispose();

咱們爲此編寫了一個簡單的測試,如下是測試結果的部分截圖:blog

ShuttleDomain生命期管理

如需獲取完整的測試源碼,請移步前往 此處 下載(測試名稱:ShuttleDomain生命期管理)。繼承

相關文章
相關標籤/搜索