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.