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;).
'możesz użyć atrybutu configSection' - Zakładam, że masz na myśli *' configSource' *? – Geoff
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