English Deutsch

XML Konfiguration

Die Abhängigkeiten, Argumente und weitere Angaben können per Xml deklariert werden, dabei ergibt sich der Vorteil, das die Konfiguration ohne Neukompilierung austauschbar ist.

Ein Nachteil ist allerdings die fehlende Typisierung, womit also durch Schreibfehler, Laufzeitfehler auftreten können.

Syntax

In der Xml-Syntax ist mit Ausnahme von Delegaten / Lambda Expression und geschlossenen generischen Typen alles enthalten, was per Code auch konfigurierbar ist.

LightCore kann Xml aus einer Standard .NET-Konfigurationsdatei auslesen (app.config oder web.config).
Dafür braucht es die Angabe des Sectionhandlers von LightCore in der Konfigurationsdatei.
Wichtig ist hierbei auch, dass die Section als Namen LightCoreConfiguration trägt.

        
     <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="LightCoreConfiguration" type="LightCore.Configuration.XamlConfigSectionHandler, LightCore.Configuration" />
    </configSections>
        
    

Anschliessend eine Beispielkonfiguration:

        
            <LightCoreConfiguration xmlns="clr-namespace:LightCore.Configuration;assembly=LightCore.Configuration">
                <LightCoreConfiguration.TypeAliases>
                    <TypeAlias Alias="HttpRequest" Type="LightCore.Integration.Web.Lifecycle.HttpRequestLifecycle, LightCore.Integration.Web" />
                </LightCoreConfiguration.TypeAliases>
                <LightCoreConfiguration.Registrations>
                    <Registration ContractType="LightCore.TestTypes.IRepository{2}, LightCore.TestTypes" ImplementationType="LightCore.TestTypes.Repository{2}, LightCore.TestTypes" />
                    <Registration ContractType="LightCore.TestTypes.IFoo" ImplementationType="LightCore.TestTypes.Foo">
                        <Registration.Arguments>
                            <Argument Value="Alexander" />
                            <Argument Value="44" Type="int" Name="AgeProperty"/>
                            <Argument Value="true" Type="bool" />
                        </Registration.Arguments>
                    </Registration>
                </LightCoreConfiguration.Registrations>
                <LightCoreConfiguration.RegistrationGroups>
                    <RegistrationGroup Name="Real">
                        <RegistrationGroup.Registrations>
                            <Registration ContractType="System.ComponentModel.IDisposable" ImplementationType="System.IO.Stream, mscorlib"/>
                        </RegistrationGroup.Registrations>
                    </RegistrationGroup>
                    <RegistrationGroup Name="Fake">
                        <RegistrationGroup.Registrations>
                            <Registration ContractType="System.ComponentModel.IDisposable" ImplementationType="MyDisposableType, MyProject"/>
                        </RegistrationGroup.Registrations>
                    </RegistrationGroup>
                </LightCoreConfiguration.RegistrationGroups>
            </LightCoreConfiguration>
        
    

Offene generische Typen

Offene generische Typen können entweder in der normalen .NET Syntax:
"LightCore.TestTypes.Repository`2, LightCore.TestTypes"

oder aber über die vereinfachte Variante von LightCore registriert werden:
"LightCore.TestTypes.Repository{2}, LightCore.TestTypes"

Dabei gibt die Zahl an, wieviele Typparameter der Typ hat, bspw. Repository<Foo, int>.

Aliase

Ein Konzept bei der Konfiguration per Xml ermöglicht es, Aliase für Typen zu definieren. Das hilft vorallem bei viel genutzten Typen, wie beispielsweise den Lifecylces von LightCore, oder auch wenn ein Typ zwei mal angegeben muss, was in einer bessere Wartbarkeit resultiert.

Folgende Aliases sind standardmässig schon registriert und können sofort genutzt werden:

Type Aliases

Wird für die Argumente einer Registration benötigt, um den Typ anzugeben.

Alias Typ
Int32, Integer, int System.Int32, mscorlib
String, string System.String, mscorlib
Boolean, bool System.Boolean, mscorlib
Guid System.Guid, mscorlib

Lifecycle Type Aliases

Wird benötigt um den DefaultLifecycle anzugeben (Siehe oben), oder aber den Lifecycle für eine Registration.
(Der HttpRequestLifecycle befindet sich in der LightCore.Integration.Web.dll und muss daher manuell nachgetragen werden, siehe [Link] LightCore in Webanwendungen).

Typen müssen im Xml an jeder Stelle entweder durch einen Alias oder vollqualifiziert angegeben werden.
Beispiel: "Name.Space.Class, Assembly" => "LightCore.Lifecycle.SingletonLifecycle, LightCore".

Alias Typ
Transient LightCore.Lifecycle.TransientLifecycle, LightCore
Singleton LightCore.Lifecycle.SingletonLifecycle, LightCore
ThreadSingleton LightCore.Lifecycle.ThreadSingletonLifecycle, LightCore

LightCoreConfiguration Attribute

Attribut Name Beschreibung Gültige Werte
ActiveRegistrationGroups Optionales Attribut, womit angegeben werden kann, welche RegistrationGroups benutzt werden sollen (Also aktiv sind und registriert werden). Gruppennamen die in Benutzung sind, einer oder mehrere durch Komma getrennt: "Xml", oder "Xml, Utils".
DefaultLifecycle Optionales Attribut über das der Standard-Lebenszyklus für die Registrierungen steuert. Alias oder eine vollqualifizierte Typangabe für einen Lifecycle.

TypeAlias Attribute

Attribut Name Beschreibung Gültige Werte
Alias Gibt den Aliasnamen an, der später benutzt werden kann. Einen beliebigen String.
Type Typangabe die später anstelle des Aliases genutzt wird. Eine vollqualifizierte Angabe, beispielsweise: "LightCore.Lifecycle.SingletonLifecycle, LightCore".

Registration Attribute

Eine Registration kann Argumente enthalten und eine RegistrationGroup Registrationen und wiederum Argumente.

Attribut Name Beschreibung Gültige Werte
ContractType Alias für einen Typen oder vollqualifizierte Typangabe, die den Kontrakt angibt. Eine vollqualifizierte Angabe, beispielsweise: "TestProject.IFoo, TestProject".
ImplementationType Alias für einen Typen oder vollqualifizierte Typangabe, die die Implementation angibt. Eine vollqualifizierte Angabe, beispielsweise: "TestProject.Foo, TestProject".
Lifecycle Optionales Attribut über das der Standard-Lebenszyklus für die Registrierungen steuert. Alias oder eine vollqualifizierte Typangabe für einen Lifecycle.
Enabled Optionales Attribut das die Registrierung aktiviert oder deaktivier (Standardmässig aktiviert). true oder false.

RegistrationGroup Attribute

Attribut Name Beschreibung Gültige Werte
Name Einen Namen für die Registrationsgruppe. Einen beliebigen String.
Enabled Optionales Attribut das die Registrierung aktiviert oder deaktivier (Standardmässig aktiviert). true oder false.

LightCore für Xml-Quelle konfigurieren

LightCore stellt über ein RegistrationModule (siehe: Erweiterbarkeit), in der Assembly LightCore.Configuration.dll, die Möglichkeit zur Verfügung, eine oder mehrere Konfigurationen aus:


  • der app.config / web.config
                    
                        var builder = new ContainerBuilder();
                        RegistrationModule xamlModule = new XamlRegistrationModule();
                                            
                        builder.RegisterModule(xamlModule);
                    
                
  • den Dateinamen mit dem Xml-Inhalt
                    
                        var builder = new ContainerBuilder();
                        string configurationFilePath = "LightCore-Configuration.xml";
                        RegistrationModule xamlModule = new XamlRegistrationModule(configurationFilePath);
                                            
                        builder.RegisterModule(xamlModule);
                    
                
  • einer Stream-Instanz die das Xml enthält (Beispielsweise aus einer Datenbank)
                    
                        var builder = new ContainerBuilder();
                        Stream configurationStream = GetStreamFromDatabase();
                        RegistrationModule xamlModule = new XamlRegistrationModule(configurationStream);
                                            
                        builder.RegisterModule(xamlModule);
                    
                

Alle Möglichkeiten zur Registrierung sind beliebig und beliebig oft kombinierbar.