myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » CustomSection in App.config definieren?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

CustomSection in App.config definieren?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
#coder#
myCSharp.de-Mitglied

avatar-3005.jpg


Dabei seit: 20.08.2008
Beiträge: 395


#coder# ist offline

CustomSection in App.config definieren?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Leute,

ich möchte in in der App.config ein neue Section Aliase hinzufügen, welche mehrere Alias Items beinhaltet. Nun hab ich es geschaft ein Alias zu definieren und mit einem Handler die Daten auszulesen:

XML-Code:
<configuration>
    <configSections>

        <section name="Alias" type="CustomSectionsTest.MyHandler, CustomSectionsTest"/>
    </configSections>

        <Alias Key="Key" Value="Value" />

</configuration>

C#-Code:
public class MyHandler : ConfigurationSection
    {
        [ConfigurationProperty("Key")]
        public string Key
        {
            get { return (string) this["Key"]; }
            set { this["Key"] = value; }
        }

        [ConfigurationProperty("Value")]
        public string Value
        {
            get { return (string) this["Value"]; }
            set { this["Value"] = value; }
        }
    }

So wird es aufgerufen:

C#-Code:
MyHandler settings = (MyHandler) ConfigurationManager.GetSection("Alias");
            Console.WriteLine(settings.Key);
            Console.WriteLine(settings.Value);

Nun möchte ich aber eine Collection von Aliase definieren:

XML-Code:
<Aliase>

<Alias Key="bla" Value="bla" />
<Alias Key="12" Value="34" />
...
</Aliase>

Nun würde ich gern es so aufrufen List<Alias> ... Wie würde dann im Handler das Property aussehen?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von #coder# am 07.06.2010 13:45.

07.06.2010 13:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.662
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich will das an einem Beispiel erklären.

Die Konfigurationsdatei:

XML-Code (App.config):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="AliasMappingSection"
                 type="gfoidl.Configuration.AliasMappingSection, ConsoleApplication1"
/>
    </configSections>
    <AliasMappingSection>
        <mappings>
            <clear />
            <add key="a" value="A" />
            <add key="b" value="B" />
            <add key="c" value="C" />
        </mappings>
    </AliasMappingSection>
</configuration>

Das Demoprogramm:

C#-Code (ConsoleApplication1.exe):
using System;
using gfoidl.Configuration;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AliasMappingSection config = AliasMappingSection.GetConfig();
            Mappings mappings = config.Mappings;
            Mapping mapping = mappings["a"];

            foreach (Mapping m in mappings)
                Console.WriteLine("{0} -> {1}", m.Key, m.Value);

            Console.ReadKey();
        }
    }
}

Damit ein eigener Konfigurationsabschnitt verwendet werden kann muss dieser definiert werden.

Zuerst definieren wir das Konfigurationselement:

C#-Code (Klasse Mapping):
using System.Configuration;

namespace gfoidl.Configuration
{
    public class Mapping : ConfigurationElement
    {
        [ConfigurationProperty("key", IsRequired = true)]
        [StringValidator(
            InvalidCharacters = "[email protected]#$%^&*()[]{}/;'\"|\\",
            MinLength = 0,
            MaxLength = 60)]
        public string Key
        {
            get { return this["key"] as string; }
        }
        //---------------------------------------------------------------------
        [ConfigurationProperty("value", IsRequired=true)]
        [StringValidator(
            InvalidCharacters = "[email protected]#$%^&*()[]{}/;'\"|\\",
            MinLength = 0,
            MaxLength = 60)]
        public string Value
        {
            get { return this["value"] as string; }
        }
    }
}

Dieses Konfigurationselement soll in einer Auflistung verwendet werden -> daher diese definieren:

C#-Code (Klasse Mappings):
using System.Configuration;

namespace gfoidl.Configuration
{
    public class Mappings : ConfigurationElementCollection
    {
        public Mapping this[int index]
        {
            get { return this.BaseGet(index) as Mapping; }
        }
        //---------------------------------------------------------------------
        public new Mapping this[string key]
        {
            get { return this.BaseGet(key) as Mapping; }
        }
        //---------------------------------------------------------------------
        protected override ConfigurationElement CreateNewElement()
        {
            return new Mapping();
        }
        //---------------------------------------------------------------------
        protected override object GetElementKey(ConfigurationElement element)
        {
            return (element as Mapping).Key;
        }
    }
}

Und nun der Konfigurationsabschnitt:

C#-Code (Klasse AliasMappingSection):
using System.Configuration;

namespace gfoidl.Configuration
{
    public class AliasMappingSection : ConfigurationSection
    {
        public static AliasMappingSection GetConfig()
        {
            return
                ConfigurationManager
                .GetSection("AliasMappingSection") as AliasMappingSection ??
                new AliasMappingSection();
        }
        //---------------------------------------------------------------------
        [ConfigurationProperty("mappings")]
        public Mappings Mappings
        {
            get
            {
                return
                    this["mappings"] as Mappings ??
                    new Mappings();
            }
        }
    }
}

Angehängt das Demo-Projekt.


mfG Gü

Speedski, Config, Customconfig, Konfiguration, Configuration


Dateianhang:
unknown Konfiguration_Key_Value.zip (9,21 KB, 280 mal heruntergeladen)
07.06.2010 14:02 Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
UNeverNo UNeverNo ist männlich
myCSharp.de-Mitglied

avatar-2338.jpg


Dabei seit: 25.06.2007
Beiträge: 153
Entwicklungsumgebung: VS 2015


UNeverNo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sehr guter Beitrag, sollte imo in die FAQ verschoben werden Daumen hoch


mycsharp.de  Moderationshinweis von winSharp93 (15.09.2011 18:14):

Ich habe ihn mal unter  [Tutorial] Konfigurationsmodell im .NET Framework verlinkt.
 
15.09.2011 14:04 Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.662
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

interessant in diesem Zusammenhang ist auch  Configuration Section Designer. Ich hab den zwar nicht probiert, aber es schaut nützlich aus.


mfG Gü
19.09.2011 19:39 Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 6 Monate.
B1rd
myCSharp.de-Mitglied

Dabei seit: 15.12.2006
Beiträge: 108


B1rd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

ich habe ein ändliches Problem.

In der App.config wurde bisher die Connections auf eine DB in den app.settings eingetragen. Dies Umfasste ca. 10 einträge. Nun bin ich die Applikation am umschreiben, so dass mehrere Server erfasst werden könnten. Dabei soll folgendes Konstrukt möglich sein.

XML-Code:
<Databases>
  <Database1>
     <add key = "a" value = "Hallo">
     <add key = "b" value = "value 2">
     <add key = "c" value = "value 3">
     <add key = "d" value = "value 4">
  </Database1>
  <Database2>
     <add key = "a" value = "Hallo">
     <add key = "b" value = "value 2">
     <add key = "c" value = "value 3">
     <add key = "d" value = "value 4">
  </Database2>
</Databases>

dies müsste ich von den appSettings in die CustomSettings wechseln. Doch leider weiss ich jetzt nicht, wie ich die Klasse aussehen muss, damit ich ein solches Konstrukt erstellen und Verwalten kann.

Könnte mir da jemand helfen? müsste ich dazu eine 4. klasse erstellen?

Besten Dank für eure Hilfe

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von B1rd am 28.03.2012 09:59.

28.03.2012 09:59 Beiträge des Benutzers | zu Buddylist hinzufügen
B1rd
myCSharp.de-Mitglied

Dabei seit: 15.12.2006
Beiträge: 108


B1rd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

Ich habe mich heute den ganzen Tag mit meinem Problem beschäftigt. Die Struktur habe ich nun mal abgeändert um dem codeBeispiel von gfoidl abgeglichen:

XML-Code:
<AliasMappingSection>
    <mappingsColl>
          <mappings name="test">
              <add key="a" value="A" />
              <add key="b" value="B" />
              <add key="c" value="C" />
          </mappings>
      <mappings name="tezttu">
        <add key="d" value="D" />
        <add key="e" value="E" />
        <add key="f" value="F" />
      </mappings>
    </mappingsColl>
    </AliasMappingSection>

Wie ihr seht habe ich die mappingsColl dazwischen geschoben (was wohl nicht nötig ist, jedoch für mich übersichtlicher war). Der Code für die mappingsColl ist wie folgt:

C#-Code:
public class MappingsColl : ConfigurationElementCollection
    {

        protected override ConfigurationElement CreateNewElement()
        {
            return new MappingsColl();
        }
        //---------------------------------------------------------------------
        protected override object GetElementKey(ConfigurationElement element)
        {
            return (element as Mapping).Key;
        }
        [ConfigurationProperty("mappings")]
        public Mappings this[object key]
        {
            get
            {
                return
                    base.BaseGet(key) as Mappings ??
                    new Mappings();
            }
        }
    }

Doch leider bekomme ich nun immer die Fehlermeldung, dass das Element mappings nur einmal vorkommen darf. Jedoch weiss ich nicht, wie ich das anpassen muss. Wenn ich den abschnitt [ConfigurationProperty("mappings")] weglasse, dann kommt der Fehler, Unbekanntes Element "mappings".

Ich glaube etwas Grundlegendes noch nicht verstanden zu haben. Könnte mir da jemand weiter helfen?

EDIT: habe gemerkt, dass die Funktion GetElementKey(ConfigurationElement element) ein bisschen blöde ist, da ich ja kein Element sonder eine ConfigurationElementCollection drin ist. muss mal schauen wie ich dies Ändern kann. Wäre aber trotzdem froh um jeden input.

Grüsse

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von B1rd am 28.03.2012 15:49.

28.03.2012 15:44 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Jahre.
Der letzte Beitrag ist älter als 8 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.09.2020 00:24