Przejdź do głównej zawartości

Mechanizm łączenia konfiguracji


Narzędzie ConfigMerge służy do scalania cząstkowych plików konfiguracyjnych w jeden docelowy plik konfiguracyjny *.config Używane jest do łączenia konfiguracji dostarczanej przez platformę VSoft archITekt z konfiguracją specyficzną dla aplikacji końcowej. Umożliwia ono rozszerzanie, zastępowanie oraz nadpisywanie wybranych elementów konfiguracji własnymi ustawieniami użytkownika lub aplikacji.

Narzędzie jest uruchamiane automatycznie podczas operacji Upgrade wykonywanej z poziomu VSoft archITekt Launcher - patrz: Aktualizacja środowiska.

Scenariusz podstawowy: dopisywanie konfiguracji​

Narzędzie pozwala na dopisywanie nowych elementów konfiguracji do pliku wynikowego. Jeżeli wskazane wpisy nie istnieją w konfiguracji bazowej, zostaną one dodane do wygenerowanego pliku konfiguracyjnego. Dzięki temu możliwe jest rozszerzanie konfiguracji platformy bez konieczności modyfikowania oryginalnych plików dostarczanych przez archITekt.

Załóżmy, że chcemy rozszerzyć dostarczony przez platformę plik Bindings.config o własny wpis. Edycja tego pliku bezpośrednio w miejscu, w którym się znajduje, nie ma sensu — przy kolejnym Upgrade projektu zostanie on przywrócony do stanu wyjściowego.

image

Aby trwale rozszerzyć konfigurację, należy utworzyć własny plik cząstkowy w folderze Files, odwzorowując w nim dokładnie ścieżkę oryginalnego pliku — nie wystarczy dodać samego pliku, trzeba odtworzyć całą ścieżkę katalogów (w tym przykładzie: Files\APP\Services.Host\Configuration\Environment), np. Bindings.config.myapp — nazwa musi mieć dodatkowe rozszerzenie* i nie może być identyczna z nazwą pliku oryginalnego.

*nie używaj tych rozszerzeń: .core, .base, .shell, .mvc, .vbp, .vmd, .vts, .algorithms, .vds, .sch, .sm, .vip Są one wewnętrznie używane przez platformę.

W nowo utworzonym pliku umieszczamy jedynie dopisywane elementy, np. nowy binding basicSOAPBinding wewnątrz sekcji basicHttpBinding, którego nie ma w pliku bazowym. Plik użytkownika może przy okazji redefiniować element już istniejący w pliku bazowym (tu: defaultBasicHttpBinding) — jeśli jego zawartość jest identyczna jak w oryginale, mechanizm go nadpisze bez żadnej widocznej zmiany.

image

Po wykonaniu operacji Upgrade projektu oryginalny plik Bindings.config zostanie rozszerzony dokładnie o te wpisy, bez naruszania pozostałej, dostarczonej przez platformę konfiguracji.

image

image

Oryginał (Bindings.config):

<bindings>
<basicHttpBinding>
<binding name="MzuServiceBinding">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
<binding name="defaultBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>

Plik stworzony przez użytkownika (Bindings.config.myapp):

<bindings>
<basicHttpBinding>
<binding name="basicSOAPBinding" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647" />
<binding name="defaultBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>

Plik wynikowy (Bindings.config po Upgrade):

<bindings>
<basicHttpBinding>
<binding name="MzuServiceBinding">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
<binding name="basicSOAPBinding" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647" />
<binding name="defaultBasicHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>

Scenariusze zaawansowane​

Poniżej opisane są poszczególne scenariusze działania mechanizmu łączenia konfiguracji. Dla każdego mechanizmu jest przedstawiony przykład ilustrujący jego działanie.

Dopisywanie konfiguracji​

Poniższy przykład jest powtórzeniem materiału opisanego w rozdziale ze scenariuszem podstawowym, ale na innym przykładzie.

Łączenie konfiguracji następuje poprzez scalenie wpisów z obu plików konfiguracyjnych z zachowaniem hierarchii węzłów XML. Jest to najczęstszy przypadek występujący w rozwiązaniach.

Oryginał (AppSettings.config):

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="RefreshTimeSec" value="2" />
<add key="WorkThreads" value="3" />
</appSettings>

Plik stworzony przez użytkownika (AppSettings.config.myapp):

<appSettings>
<add key="wcfTransportSecurity" value="{scheduler.bool.transportSecurity}" />
<add key="wcfSecurityClientCredentialType" value="None" />
</appSettings>

Plik wynikowy (AppSettings.config):

<appSettings>
<add key="RefreshTimeSec" value="2" />
<add key="WorkThreads" value="3" />
<add key="wcfTransportSecurity" value="{scheduler.bool.transportSecurity}" />
<add key="wcfSecurityClientCredentialType" value="None" />
</appSettings>

Nadpisywanie konfiguracji​

Nadpisywanie konfiguracji polega na zastąpieniu istniejącego wpisu przez wpis z później przetwarzanego pliku konfiguracyjnego. Jest to używane wówczas, gdy aplikacja chce zmienić konfigurację dostarczaną przez VSoft archITekt.

Mechanizm rozpoznawania czy dany element XML jest tym samym w obu plikach bazuje na identycznych wartościach atrybutów key i name ze specjalnym uwzględnieniem kilku elementów konfiguracyjnych.

Oryginał (ConnectionStrings.config):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{common.connection.db_config}" providerName="System.Data.SqlClient" />
<add name="VSFE.NODES_DB" providerName="System.Data.SqlClient" connectionString="{common.connection.db_config}" />
</connectionStrings>

Plik stworzony przez użytkownika (ConnectionStrings.config.myapp):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{my.configuration.db_config}" providerName="System.Data.SqlClient" />
</connectionStrings>

Plik wynikowy (ConnectionStrings.config):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{my.configuration.db_config}" providerName="System.Data.SqlClient" />
<add name="VSFE.NODES_DB" providerName="System.Data.SqlClient" connectionString="{common.connection.db_config}" />
</connectionStrings>

Usuwanie fragmentu konfiguracji​

Usuwanie konfiguracji polega na usunięciu części lub całości rekordów z dotychczas przetworzonych plików.

ostrzeżenie

Mechanizm usuwający nie potrafi rozpoznać elementów listy. Chcąc zmodyfikować listę należy usunąć element zawierający listę i dodać go na nowo.

Wariant 1 — usunięcie całej sekcji i zastąpienie jej nową zawartością:

Oryginał (ConnectionStrings.config):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{common.connection.db_config}" providerName="System.Data.SqlClient" />
<add name="VSFE.NODES_DB" providerName="System.Data.SqlClient" connectionString="{common.connection.db_config}" />
</connectionStrings>

Plik stworzony przez użytkownika (ConnectionStrings.config.myapp):

<!--REMOVE: connectionStrings -->
<connectionStrings>
<add name="DICTIONARIES" connectionString="{common.connection.db_config}" providerName="SqlServer2008" />
</connectionStrings>

Plik wynikowy (ConnectionStrings.config):

<connectionStrings>
<add name="DICTIONARIES" connectionString="{common.connection.db_config}" providerName="SqlServer2008" />
</connectionStrings>

Wariant 2 — usunięcie pojedynczego wpisu:

Oryginał (ConnectionStrings.config):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{common.connection.db_config}" providerName="System.Data.SqlClient" />
<add name="VSFE.NODES_DB" providerName="System.Data.SqlClient" connectionString="{common.connection.db_config}" />
</connectionStrings>

Plik stworzony przez użytkownika (ConnectionStrings.config.myapp):

<connectionStrings>
<!--REMOVE: add name="VSFE.NODES_DB" -->
</connectionStrings>

Plik wynikowy (ConnectionStrings.config):

<connectionStrings>
<add name="VSFE.CONFIG_DB" connectionString="{common.connection.db_config}" providerName="System.Data.SqlClient" />
</connectionStrings>

Zobacz również​

Troubleshooting

Konfiguracja techniczna aplikacji