2009-01-26 6 views

Odpowiedz

69

Tak, można użyć atrybutu configSource bloku konfiguracyjnego. Wszystkie bloki konfiguracyjne mają ten atrybut - chociaż nie jest on udokumentowany.

Zobacz this article, aż na dole, załącznik B. Ja również wklejony do odpowiedniej sekcji poniżej:

Dodatek B: łącznie z zewnętrznych plików konfiguracyjnych

Pomimo wszystkich wielkości można znaleźć w funkcjach konfiguracyjnych .NET 2.0, jest jedna wada. Podczas pracy nad pojedynczym projektem w wielu środowiskach zarządzanie konfiguracją może stać się koszmarem. Proces zarządzania wieloma wersjami pliku konfiguracyjnego dla wielu środowisk - tj. Programowaniem, testowaniem, wdrażaniem i produkcją - w mojej obecnej pracy obejmuje ręczne porównywanie plików .config za każdym razem, gdy zmiany są wdrażane w jednym lub w innym środowisku, z ręcznym procesem scalania . Spędziłem miesiące próbując znaleźć lepszy sposób i ostatecznie go znalazłem. Wprowadź jedną z tych "tak" ukochanych "nieudokumentowanych" - lub w tym przypadku, tylko słabo udokumentowanych - funkcji, z których Microsoft jest tak znany: configSource. Natknąłem się na ten mały klejnot, kiedy przeglądałem kod źródłowy konfiguracji .NET 2.0 za pomocą Reflectora, cudownego małego narzędzia.

Każdej sekcji konfiguracji, analizowanej i ładowanej przez klasy konfiguracji .NET, przypisywany jest obiekt SectionInformation. Obiekt SectionInformation zawiera meta informacje o sekcji konfiguracji i pozwala na pewne zarządzanie w jaki sposób sekcje zastępują się nawzajem, gdy są zdefiniowane w podrzędnym pliku konfiguracyjnym (ASP.NET). Na razie zignorujemy większość tego, co ma do zaoferowania SectionInformation, z wyjątkiem właściwości ConfigSource. Dodając atrybut configSource do elementu głównego dowolnego ConfigurationSection, można określić alternatywne, zewnętrzne źródło, z którego będą ładowane ustawienia konfiguracyjne.

<!-- SomeProgram.exe.config --> 
<configuration> 
    <connectionStrings configSource="externalConfig/connectionStrings.config"/> 
</configuration> 

<!-- externalConfig/connectionStrings.config --> 
<connectionStrings> 
    <add name="conn" connectionString="blahblah" /> 
</connectionStrings> 

W pliku konfiguracyjnym powyżej, sekcja <connectionStrings> została pochodzą z pliku o nazwie externalConfig/connectionStrings.config. Wszystkie ciągi połączeń aplikacji zostaną załadowane z określonego pliku. Teraz, gdy ciągi połączenia są ładowane z zewnętrznego zasobu, stosunkowo łatwo jest utworzyć plik connectionStrings.config w każdym środowisku w tej samej względnej lokalizacji. Stąd część ścieżki externalConfig/. Piękno polega na tym, że możemy jednorazowo zdefiniować łańcuchy połączeń dla każdego środowiska. Nie musimy się martwić o przypadkowe nadpisanie tych ustawień podczas wdrożenia, w którym plik konfiguracyjny został nieprawidłowo scalony lub w ogóle nie został scalony. Może to być ogromnym ułatwieniem przy wdrażaniu zmian w aplikacji do środowiska produkcyjnego, gdzie krytyczne jest, aby istniały poprawne ciągi połączeń z bazą danych. Upadek używania atrybutu configSource polega na tym, że wymaga on, aby wszystkie ustawienia konfiguracyjne zostały umieszczone w pliku zewnętrznym. Nie jest możliwe dziedziczenie lub nadpisywanie, co w niektórych przypadkach czyni go bezużytecznym. Wszystkie zewnętrzne pliki konfiguracyjne używane z atrybutem configSource muszą również znajdować się w względnej ścieżce podrzędnej do głównego pliku .config. Uważam, że dotyczy to kwestii związanych z bezpieczeństwem podczas przechowywania pliku we względnej ścieżce nadrzędnej w środowisku sieciowym.

Należy jeszcze zwrócić uwagę na to, że sekcja <appSettings> ma lepszą alternatywę dla używania configSource, zwanego plikiem. Jeśli użyjesz atrybutu pliku zamiast configSource w sekcji <appSettings>, możesz zdefiniować ustawienia zarówno w pliku głównym .config, jak iw pliku, do którego się odwołujesz. Ustawienia z głównego pliku .config mogą również zostać nadpisane w pliku odniesienia, po prostu przez dodanie czegoś z tym samym kluczem. Niestety, atrybut pliku jest dostępny tylko w sekcji <appSettings> i nie jest wbudowany w strukturę konfiguracji. Możliwe jest zaimplementowanie podobnego atrybutu we własnych sekcjach konfiguracji. Zostanie to omówione w przyszłej wersji zaawansowanych tematów konfiguracji, po kilku wstępnie wymaganych ratach;).

+0

'możesz użyć atrybutu configSection' - Zakładam, że masz na myśli *' configSource' *? – Geoff

+0

Należy zauważyć, jak właśnie się dowiedziałem, że musi to być ścieżka fizyczna i nie może być ścieżką UNC: ( – Perry