Til dynamisk indlæsning af konfigurationer, der er applikationsspecifikke, kan nedestående kode benyttes til at tilgå konfiguration for den enkelte applikation.
Et applikationskontekst bliver etableret og herigennem kan konfigurationsværdier tilgås. I dette tilfælde er almindelige konfigurationsværdier, sti for log4net og windsor konfiguration placeret i en enkel konfigurationsfil i en applikationsspecifik mappe.

Navnet på applikationen og mappen er en-til-en og indlæsning sker een gang for alle, og herefter kan singleton klassen tilgås på tværs af assemblies i den samme applikation.

   1:   /// <summary>
   2:   /// Applikationskontekst for applikationen.
   3:   /// </summary>
   4:   public sealed class ApplikationKontekst : Kontekst
   5:   {
   6:       /// <summary>
   7:       /// Lås på instans.
   8:       /// </summary>
   9:       private static readonly object SyncRoot = new object();
  10:   
  11:       /// <summary>
  12:       /// Instans af applikationskontekst.
  13:       /// </summary>
  14:       private static volatile ApplikationKontekst instans;
  15:   
  16:       /// <summary>
  17:       /// Instans af applikationskontekst.
  18:       /// </summary>
  19:       public static ApplikationKontekst Instans
  20:       {
  21:           get
  22:           {
  23:               lock (SyncRoot)
  24:               {
  25:                   return instans ?? (instans = new ApplikationKontekst
  26:                       {
  27:                           Navn = Assembly.GetCallingAssembly().GetName().Name
  28:                       });
  29:               }
  30:           }
  31:       }
  32:   
  33:       /// <summary>
  34:       /// Sætter nyt kontekst objekt op.
  35:       /// </summary>
  36:       public static void SetupKontekst()
  37:       {
  38:           Instans.Navn = Assembly.GetCallingAssembly().GetName().Name;
  39:       }
  40:   }


Kontekst klassen:

   1:   /// <summary>
   2:   /// Kontekst.
   3:   /// </summary>
   4:   public abstract class Kontekst
   5:   {
   6:       /// <summary>
   7:       /// Navn på assembly eller applikation.
   8:       /// </summary>
   9:       public string Navn { get; set; }
  10:   
  11:       /// <summary>
  12:       /// Konfigurationer fra konfigurationsstien.
  13:       /// </summary>
  14:       public Configuration Konfiguration
  15:       {
  16:           get
  17:           {
  18:               return KonfigurationProvider.HentKonfiguration(
  19:                   Konfigurationer.Default[FriendlyNavn(this.Navn)].ToString());
  20:           }
  21:       }
  22:   
  23:       /// <summary>
  24:       /// Fjerner evt. det fuld kvalificerede (Fully Qualified name)
  25:       ///  navn på assembly. Dvs. fjerner evt. namespaces.
  26:       /// </summary>
  27:       /// <param name="applikation">Navn på assembly.</param>
  28:       /// <returns>Det korte navn på assembly uden fuld namespace.</returns>
  29:       private static string FriendlyNavn(string applikation)
  30:       {
  31:           // Regexp udtryk søger bagfra i strengen, og fjerner alt fra '.'
  32:           // og nedefter. (dvs. fra højre mod venstre).
  33:           var regex = new Regex(@"(?<=\.)[^.]*$|^[^.]*$");
  34:           return regex.Match(applikation).Value;
  35:        }
  36:   }


Til indlæsning af konfigurationsfil:

   1:  public static class KonfigurationProvider
   2:  {
   3:      /// <summary>
   4:      /// Konfiguration objekt.
   5:      /// </summary>
   6:      private static Configuration konfiguration;
   7:   
   8:      /// <summary>
   9:      /// Henter konfiguration.
  10:      /// </summary>
  11:      /// <param name="konfigurationsfilSti"> The konfigurations Path. </param>
  12:      /// <returns> Konfigrationsobjekt i applikaitonshukommelse. </returns>
  13:      public static Configuration HentKonfiguration(string konfigurationsfilSti)
  14:      {
  15:          if (konfiguration != null)
  16:          {
  17:              return konfiguration;
  18:          }
  19:   
  20:          var filmap = new ExeConfigurationFileMap
  21:              {
  22:                  ExeConfigFilename = konfigurationsfilSti
  23:              };
  24:   
  25:          konfiguration = ConfigurationManager.OpenMappedExeConfiguration(
  26:              filmap, ConfigurationUserLevel.None);
  27:   
  28:          return konfiguration;
  29:      }
  30:  }


Værdierne tilgås herefter:

var a = ApplikationKontekst.Instans.Konfiguration.AppSettings.Settings["Windsor"].Value;
var b = ApplikationKontekst.Instans.Konfiguration.AppSettings.Settings["Log4Net"].Value;

Jeg er blevet spurtgt af flere, hvorfor der er behov for alt dette. Det korte svar er, at det kan være et alternativ til SSO i BizTalk.
Dog skal man være opmærksom, at denne måde at indlæse kræver at mappen, der holder på konfigurationerne ligger udenfor applikationen, hvilket ikke er oplagt i clustered miljøer.