ObjRef objrefWellKnown = RemotingServices.Marshal(obj, "ServiceMessage"); |
如果要註銷對象,則:
RemotingServices.Disconnect(obj); |
要注意,這裏Disconnect的類對象必須是前面實例化的對象。正因爲此,我們可以根據需要創建指定的遠程對象,而關閉時,則Disconnect之前實例化的對象。
至於客戶端的調用,和前面WellKnown模式的方法相同,仍然是通過Activator.GetObject()來獲得。但從實現代碼來看,我們會注意到一個問題,由於服務器端是顯式的實例化了遠程對象,因此不管客戶端有多少,是否相同,它們調用的都是同一個遠程對象。因此我們將這個方法稱爲模擬的SingleTon模式。
客戶端激活模式
我們也可以通過Marshal()和Disconnect()來模擬客戶端激活模式。首先我們來回顧“遠程對象元數據相關性”一節,在這一節中,我說到採用設計模式的“抽象工廠”來創建對象實例,以此用SingleCall模式來模擬客戶端激活模式。在仔細想想前面的模擬的SingleTon模式。是不是答案就將呼之欲出呢?
在“模擬的SingleTon”模式中,我們是將具體的遠程對象實例進行Marshal,以此讓客戶端獲得該對象的引用信息。那麼我們換一種思路,當我們用抽象工廠提供接口,工廠類實現創建遠程對象的方法。然後我們在服務器端創建工廠類實例。再將這個工廠類實例進行Marshal。而客戶端獲取對象時,不是獲取具體的遠程對象,而是獲取具體的工廠類對象。然後再調用CreateInstance()方法來創建具體的遠程對象實例。此時,對於多個客戶端而言,調用的是同一個工廠類對象;然而遠程對象是在各個客戶端自己創建的,因此對於遠程對象而言,則是由客戶端激活,創建的是不同對象了。
當我們要啓動/關閉指定對象時,只需要用Disconnet()方法來註銷工廠類對象就可以了。
六、小結
Microsoft.Net Remoting真可以說是博大精深。整個Remoting的內容不是我這一篇小文所能盡述的,更不是我這個Remoting的初學者所能掌握的。王國維在《人間詞話》一書中寫到:古今之成大事業大學問者,必經過三種境界。“昨夜西風凋碧樹,獨上高樓,望盡天涯路。”此第一境界也。“衣帶漸寬終不悔,爲伊消得人憔悴。”此第二境界也。“衆裏尋他千百度,驀然回首,那人卻在燈火闌珊處。”此第三境界也。如以此來形容我對Remoting的學習,還處於“獨上高樓,望盡天涯路”的時候,真可以說還未曾登堂入室。
或許需得“衣帶漸寬”,學得Remoting“終不悔”,方纔可以“驀然回首”吧。