2011-01-24 12 views
10

Przy dostępie AppSettings bieżącej aplikacji użytkownika, otrzymuję NameValueCollection:.net AppSettings pliku config: NameValueCollection vs. KeyValueConfigurationCollection

NameValueCollection settings = 
    ConfigurationManager.AppSettings; 

Przy dostępie AppSettings innych aplikacji, otrzymuję KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings; 

  1. Czy istnieje powód, dla którego te dwie metody (ConfigurationManager.AppSettings i AppSettingsSection.Settings) mają podobne, ale różne (i niezgodne) typy zwrotu? Może używam przestarzałej metody w jednym z dwóch przypadków?

  2. Czy istnieje prosty sposób na uzyskanie tego samego typu w obu przypadkach, tj. Uzyskanie wartości NameValueCollection dla zestawu aplikacji innej aplikacji lub KeyValueConfigurationCollection dla aplikacji aktualnie uruchomionej aplikacji?


Aktualizacja: W pytaniu 2, znalazłem następujący sposób, aby uzyskać konfigurację aktualnie uruchomionej (non-web) aplikacji jako KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings; 
+0

Wiem, że to stare pytanie, ale sugerowana odpowiedź (Aktualizacja) w OP nie działa w aplikacji _web_: ~ ( –

+0

@ Pure.Krome: Dobrze, dzięki. Zaktualizowałem moją odpowiedź -inside-the-question Niestety, nie znam rozwiązania dla aplikacji internetowych – Heinzi

+0

dodam jeden później :) Mam go pokryte .. –

Odpowiedz

2

Obie próbują rozwiązać ten sam problem i są zgodne z tym samym schematem konfiguracji, ale różnica polega na tym, że obie ewoluowały w różnych czasach rozwoju, jak powiedziałeś.

Ale nie chodzi o to, że używasz nieaktualnych wersji. To są różne sposoby uzyskania tego samego rezultatu. Może nie wiesz dlaczego, ale czasami musisz uzyskać konfigurację z różnych źródeł, więc warto mieć te opcje.

Odpowiedzi na twoje drugie pytanie można zaimplementować metodę rozszerzenia dla obu typów zwracanych, konwertując je do wspólnego typu.

Na przykład, jeśli chcesz NameValueCollection można wdrożyć że:

public static NameValueCollection ToCollection(this KeyValueConfigurationCollection source) 
{ 
     // An iterator to create a NameValueCollection here and return it. 
} 

Albo jeśli chcesz KeyValueConfigurationCollection, można zrobić to samo, ale na powrocie wystąpień tego typu.

Następnie, gdy chcesz mieć AppSettings, możesz wykonać ConfigurationManager.AppSettings.ToCollection(); i/lub ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings.ToCollection();. Sprawdź edytowanie odpowiedzi autora! Ta część mojej odpowiedzi jest błędna i bezużyteczna :) Dzięki.

W rzeczywistości zbiory nazw i wartości są w pewnym sensie nieaktualne, ponieważ pochodzą z .net 1.x dni. Ale nie jest przestarzały, ponieważ jest to sposób na zrobienie tego (na razie).

+0

Dzięki za wyjaśnienie. O konwersji: myślę, że znalazłem łatwiejsze rozwiązanie tego problemu, zobacz aktualizację mojego pytania. – Heinzi

+0

Ups! To prawda, przepraszam za ten błąd! Mając to rozwiązanie, ta metoda rozszerzenia staje się bezużyteczna i ponowne odkrycie koła :) –

+0

Preferowanie zależności od System.Collections.Specialized.NameValueCollection przez System.Configuration.KeyValueConfigurationCollection zwalnia komponent z oczekiwanych nazwanych wartości w sekcji konfiguracji. –

Powiązane problemy