2010-10-02 5 views
7

Was ist der beste Weg, um einen Bootstrapper für meine MVC 2 App zu erstellen? Ich verwende Unity und AutoMapper und möchte das Laden und Konfigurieren von ihnen so weit wie möglich abstrahieren.Wie sollte ich einen MVC Bootstrapper für Unity und AutoMapper implementieren?

Ein anständiges Beispiel ist hier (http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx ), aber UnityContainer implementiert IDisposable und in diesem Beispiel wird es nie bereinigt. Dies (Configuring Automapper in Bootstrapper violates Open-Closed Principle?) ist auch ein anständiges Beispiel, aber er beschäftigt sich auch nicht mit dem Unity/Disposable Problem.

Hier ist (http://www.dominicpettifer.co.uk/Blog/42/put-an-ioc-powered-bootstrapper-in-your-asp-net-mvc-application) ein weiteres großartiges Beispiel, wie man einen Bootstrapper macht, aber wieder das Unity/Disposable Problem nicht adressiert.

Ich dachte daran, mein Bootstrapper-Objekt in einer statischen Variable herumzuhalten und es IDisposable zu implementieren, aber das klingt nicht richtig.

Antwort

4

Wenn Sie einen Verweis auf den Container in der Bootstrapper-Klasse behalten, können Sie ihn auf der Anwendungsseite ablegen.

public static class Bootstrapper 
{ 
    private static IUnityContainer _container; 

    public static void Run() 
    { 
     _container = new UnityContainer(); 

     // Configure container here... 
    } 

    public static void Dispose() 
    { 
     _container.Dispose(); 
    } 
} 

public class YourHttpApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     Bootstrapper.Run(); 
    } 

    protected void Application_End() 
    { 
     Bootstrapper.Dispose(); 
    } 
} 

Oder Sie könnten den Container von Ihrem Bootstrapper zurückgeben, einen Verweis darauf behalten und ihn auf Anwendungsende entsorgen.

public class YourHttpApplication : HttpApplication 
{ 
    private IUnityContainer _container; 

    protected void Application_Start() 
    { 
     _container = Bootstrapper.Run(); 
    } 

    protected void Application_End() 
    { 
     _container.Dispose(); 
    } 
} 

Hängt von Ihrer Präferenz ab, denke ich. Abgesehen davon sollten alle Bootstrapping-Beispiele, die in der Frage aufgeführt sind, eine gute Wahl sein, um Ihre Anwendung zu starten.

+0

Warum haben Sie kein Bootstrapper-Paket und Methoden von Guide verwendet? Es sieht vielleicht so aus: 'Bootstrapper.With.Unity(). And.AutoMapper(). And.StartupTasks(). Start();' –