2011-11-07 29 views
0

我有執行GoF's proxy pattern in C#的代碼。該代碼具有用於計算算術函數的MathProxy。在代理模式中使用C#中的AppDomain的優點?

左邊的例子是一個實現,右邊是使用AppDomain的C#(.NET)更好的一個。

我可以期待使用AppDomain特別是使用代理模式有什麼好處?

public MathProxy() 
{ 
    // Create Math instance in a different AppDomain 
    var ad = AppDomain.CreateDomain("MathDomain", null, null); 

    var o = ad.CreateInstance(
     "DoFactory.GangOfFour.Proxy.NETOptimized", 
     "DoFactory.GangOfFour.Proxy.NETOptimized.Math"); 
    _math = (Math)o.Unwrap(); 
} 

enter image description here

回答

2

在任何給定的Windows過程承載CLR可以具有所定義的一個或多個應用程序域提供了一個隔離邊界包含可執行代碼,數據,元數據結構和資源。除了在建過程中的保護保障,應用領域進一步引入了以下擔保:

  • 應用域內故障碼無法產生不利影響的代碼在同一個進程中的不同應用程序域中運行。
  • 在應用程序域內運行的代碼不能直接訪問不同應用程序域中的資源。
  • 特定於代碼的配置可以在每個應用程序域的基礎上配置。例如,您可以根據每個應用程序域配置特定於安全性的設置。應用程序域和過程之間
1

AppDomain提供隔離邊界在CLR相同作爲process在操作系統級

1

差異:

過程: 當用戶啓動一個應用程序,存儲器和資源的整個主機被分配給該應用程序。這種內存和資源的物理分離被稱爲一個過程。應用程序可能啓動多個進程。需要注意的是,應用程序和流程根本不是一回事。

AppDomain: 微軟還引入了額外的一層稱爲AppDomain的抽象/隔離。 AppDomain不是物理隔離,而是過程中的邏輯隔離。由於一個流程中可以存在多個AppDomain,因此我們可以獲得一些好處。例如,在我們擁有AppDomain之前,需要訪問彼此數據的進程必須使用代理,這會導致額外的代碼和開銷。通過使用AppDomain,可以在同一個進程中啓動多個應用程序。 AppDomain也可以使用與進程存在相同類型的隔離。線程可以跨應用程序域執行,而不需要進程間通信的開銷。這全部封裝在AppDomain類中。任何時候在應用程序中加載名稱空間時,都會將其加載到AppDomain中。除非另有說明,否則使用的AppDomain將與調用代碼相同。 AppDomain可能包含或不包含線程,這與進程不同。

爲什麼你應該使用應用程序域:爲應用程序域Read Post

良好的用例場景: 「NUnit的是書面的.NET框架的專家。如果你看一下NUnit的來源,你看,他們知道如何動態創建。 AppDomains並將程序集加載到這些域中。爲什麼動態AppDomain很重要?動態AppDomain讓NUnit能做的事情就是讓NUnit處於打開狀態,同時允許您編譯,測試,修改,重新編譯和重新測試代碼,而無需關閉。您可以這樣做,因爲NUnit shadow會複製您的程序集,將它們加載到動態域中,並使用文件觀察器查看是否更改它們。如果你改變你的組件,然後NUnit的轉儲動態的AppDomain,重新複製文件,創建一個新的AppDomain,並準備着呢。」從Sacha Barbers article

整個信息

相關問題