Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...
Dynamischer Bootstrapper mit LightCore

Ein Bootstrapper erledigt Dinge bei Start einer Anwendung.

Oft werde Dinge, die beim Start einer Anwendung ausgeführt werden sollen, direkt in die Anwendung gepackt, mit dem Nachteil, dass erstens der Code an dieser Stelle unübersichtlich wird und zweitens nur schwer wartbar. Ziel ist es beim Starten der Anwendung so wenig Code wie möglich zu haben. Ziel ist es das Prinzip Separation of Concerns (siehe CCD) einzuhalten.

Der folgende Bootstrapper ist fürs Web gedacht, kann aber mit ein paar Änderungen auch für alle anderen Plattformen genutzt werden. Das Original, von dem ich hier abgeschaut habe ist sogar so gestrickt, dass er überall verwendet werden kann. (Abgeschaut habe ich das bei Albert Weinerts Anwendung SpeakerNet)

Man stelle sich vor man hätte eine Routine, die alles was zum Start erledigt werden muss, automatisch erledigt, ohne dass man es umständlich implementieren muss. Sondern nur indem man eine Klasse schreibt, die eine bestimmte Methode implementiert haben muss. Diese Klasse kann auch in einer separaten Assembly liegen und bei Bedarf genutzt werden:

public class SetStartupDate : BootStrapItem
{
    public void Execute()
    {
        // Aktion ist völlig unsinnig reicht aber fürs Demo ;-)
        Global.StartupDate = DateTime.Now;
    }
}

Das Interface definiert nur die Methode Execute:

public class BootStrapItem
{
    void Execute();
}

Und jetzt die Magie: Statt alles in die Global.asax ins Application_Start zu packen, soll in meinem Fall nur dieser Bootstrapper in der Global.asax aufgerufen werden:

protected void Application_Start()
{
    […]
    
    Bootstrapper.CreateNew()
        .Execute();
}

Magie ist das aber nicht nicht wirklich. Wichtig ist im Bootstrapper die Methode LoadFromServiceLocator, die alle BootStrapItems holt, die im Dependency Injection Container definiert sind und in einer Liste zwischenspeichert:

private void LoadFromServiceLocator()
{
    IContainerAccessor accessor = (IContainerAccessor)
                                                 HttpContext.Current.ApplicationInstance;
    var container = accessor.Container;
    var instances = container.ResolveAll<IBootstrapItem>();

    _bootstrapItems.AddRange(instances);
}

(Natürlich nutze ich hier den Service Locator meines favorisierten DI-Container: LightCore )

Die LightCore Methode ResolveAll holt alle Instanzen der registrierten IBootstrapItems, die in LightCore wie folgt registriert sind:

var builder = new ContainerBuilder();
[…]
builder.Register<IBootstrapItem, AreasInitializer>();
builder.Register<IBootstrapItem, ControllerFactoryInitializer>();
builder.Register<IBootstrapItem, GlobalFiltersInitializer>();
builder.Register<IBootstrapItem, RoutesInitializer>();
builder.Register<IBootstrapItem, DataStoreInitializer>();
builder.Register<IBootstrapItem, SetStartupDate>();

(Alternativ kann die Registrierung der BootstrapItems auch per XML vorgenommen werden um das Bootstrapping ohne neukompilierung konfigurieren zu müssen. Der Einfachheit halber habe ich es hier per Code gemacht.)

Und am Ende ruft der Bootstrapper nur noch alle Execute-Methoden auf und führt ein BootstrapItem nach dem anderen aus:

public void Execute()
{
    LoadFromServiceLocator();
    foreach (var bootstrapItem in _bootstrapItems)
    {
        bootstrapItem.Execute();
    }
}

Den kompletten Bootsrapper kann man sich nun hier ansehen:
https://github.com/JuergenGutsch/NetCommunityEvents/blob/master/NetCommunityEvents/Infrastructure/Bootstrapper.cs

DotNetKicks-DE Image
Posted: Montag, 7. Februar 2011 07:35 von Jürgen Gutsch

Kommentare

dotnet-kicks.de sagte:

Sie wurden gekickt (eine gute Sache) - Trackback von dotnet-kicks.de

# Februar 9, 2011 08:21
Anonyme Kommentare sind nicht zugelassen