Dobry przykład wykorzystania AppDomain

Ciągle pytają mnie o AppDomains w wywiadach i znam podstawy :

    Są to poziomy izolacji wewnątrz aplikacji (co odróżnia je od aplikacji)
  • mogą mieć wątki (różniące się od wątków)
  • wyjątki w jednej aplikacji nie wpływają na inną
  • appdomains nie mogą uzyskać dostępu do swojej pamięci
  • każda appdomain może mieć inne zabezpieczenia

I still don ' t get what makes them konieczne. Szukam rozsądnej konkretnej okoliczności, w której byś ją użył.

Odpowiedzi:

  • niezaufany kod
    • Core application protected
      Niezaufane / wtyczki innych firm są zablokowane przed uszkodzeniem pamięci współdzielonej i nieautoryzowanym dostępem do rejestru lub dysku twardego przez izolację w oddzielnej appdomain z ograniczeniami bezpieczeństwa, chroniąc aplikację lub serwer. np. ASP.NET i Kod komponentu SQL Server hosting
  • zaufany kod
    • stabilność
      Aplikacja podzielona na bezpieczne, niezależne funkcje / funkcjonalność
    • elastyczność architektoniczna
      Swoboda uruchamiania wielu aplikacji w ramach jednej instancji CLR lub każdego programu we własnym zakresie.

Coś jeszcze?

Author: hughdbrown, 2008-09-19

7 answers

Prawdopodobnie najczęstszym jest ładowanie zestawów zawierających kod plug-in od niezaufanych stron. Kod działa we własnej AppDomain, izolując aplikację.

Nie jest również możliwe rozładowanie określonego zestawu, ale można rozładować AppDomains.

Dla pełnego podsumowania Chris Brumme miał ogromny wpis na blogu na ten temat:

Http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

 49
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 22:08:13

Kolejną zaletą AppDomains (jak wspomniano w pytaniu) jest kod, który można załadować do niego może działać z różnymi uprawnieniami zabezpieczeń. Na przykład napisałem aplikację, która dynamicznie ładuje biblioteki DLL. Byłem instruktorem, a to były studenckie biblioteki DLL, które ładowałem. Nie chciałem, aby jakiś niezadowolony student wymazał mój dysk twardy lub uszkodził mój rejestr, więc załadowałem kod z ich bibliotek DLL do osobnej AppDomain, która nie miała uprawnień do IO plików lub uprawnień do edycji rejestru lub nawet uprawnienia do wyświetlania nowych okien (w rzeczywistości miał tylko uprawnienia execute).

 14
Author: Jon Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:13:26

Myślę, że główną motywacją do posiadania AppDomain jest to, że projektanci CLR chcieli sposobu na izolowanie zarządzanego kodu bez obciążania wydajności wielu procesów Windows. Gdyby CLR został pierwotnie zaimplementowany na Uniksie (gdzie tworzenie wielu procesów jest znacznie tańsze), AppDomain może nigdy nie zostać wymyślony.

Również, o ile zarządzane architektury wtyczek w aplikacjach innych firm są zdecydowanie dobrym wykorzystaniem AppDomain, tym większy powód, dla którego są one exist jest dla znanych hostów jak SQL Server 2005 i ASP.NET. na przykład, an ASP.NET dostawca hostingu może zaoferować rozwiązanie hostingu współdzielonego, które obsługuje wiele witryn od wielu klientów w tym samym polu działającym w ramach jednego procesu Windows.

 7
Author: C. Dragon 76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 22:50:35

Domeny aplikacji są świetne dla stabilności aplikacji.

Dzięki temu, że Twoja aplikacja składa się z centralnego procesu, który następnie pojawia się "funkcje" w oddzielnych domenach aplikacji, możesz zapobiec globalnej awarii, jeśli jedna z nich źle się zachowuje.

 4
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 22:08:46

Jeśli utworzysz aplikację, która umożliwia wtyczki innych firm, możesz załadować te wtyczki do oddzielnej domeny AppDomain, aby Twoja główna aplikacja była bezpieczna przed nieznanym kodem.

ASP.NET używa również oddzielnych domen Appdomen dla każdej aplikacji internetowej w ramach jednego procesu roboczego.

 4
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 22:09:08

Jak rozumiem, AppDomain są zaprojektowane tak, aby umożliwić podmiotowi hostingowemu (OS, DB, Serwer itp...) swoboda uruchamiania wielu aplikacji w ramach jednej instancji CLR lub każdego programu we własnym zakresie. Więc jest to problem dla hosta, a nie dewelopera aplikacji.

Jest to korzystne w porównaniu z Javą, gdzie zawsze masz 1 JVM na aplikację, co często skutkuje wieloma instancjami JVM działającymi obok siebie z duplikowanymi zasobami.

 3
Author: Garth Gilmour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 22:12:43

Widzę 2 lub 3 główne przypadki użycia do tworzenia oddzielnych domen aplikacji:

1) izolacja podobna do procesu przy niskim zużyciu zasobów i obciążeniu. Na przykład, to jest to, co ASP.NET does-hostuje każdą witrynę w osobnej domenie aplikacji. Jeśli użyje różnych wątków w domenie pojedynczej aplikacji, kod różnych stron internetowych może się ze sobą kolidować. Gdyby hostował różne strony internetowe w różnych procesach-wykorzystywałby wiele zasobów, a także interproces komunikacja jest stosunkowo trudna w porównaniu do komunikacji w procesie.

2) Wykonywanie niezaufanego kodu w oddzielnej domenie aplikacji z określonymi uprawnieniami bezpieczeństwa(w rzeczywistości jest to związane z 1. powodem). Jak już ludzie powiedzieli, możesz załadować wtyczki innych firm lub niezaufane biblioteki DLL do oddzielnych domen aplikacji.

3) Możliwość rozładowania złożeń w celu zmniejszenia niepotrzebnego zużycia pamięci. Niestety, nie ma możliwości rozładowania zespołu z domena aplikacji. Więc jeśli załadujesz jakiś duży zespół do głównej domeny aplikacji, jedynym sposobem na uwolnienie odpowiedniej pamięci po tym złożeniu nie jest już potrzebne jest zamknięcie aplikacji. Ładowanie zespołów w oddzielnej domenie aplikacji i rozładowywanie tej domeny aplikacji, gdy te zespoły nie są już potrzebne, jest rozwiązaniem tego problemu.

 3
Author: nightcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-19 02:35:23