2010-10-02 2 views
7

Каков наилучший способ создать загрузчик для моего приложения MVC 2? Я использую Unity и AutoMapper и хочу как можно больше абстрагировать загрузку и настройку.Как я должен выполнить загрузку MVC для Unity и AutoMapper?

Приятный пример здесь (http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx ), но UnityContainer реализует IDisposable и в этом примере он никогда не очищается. Это (Configuring Automapper in Bootstrapper violates Open-Closed Principle?) также является достойным примером, но он также не имеет проблемы с Unity/Disposable.

Здесь (http://www.dominicpettifer.co.uk/Blog/42/put-an-ioc-powered-bootstrapper-in-your-asp-net-mvc-application) еще один отличный пример того, как сделать Bootstrapper, но опять же не затрагивает проблему Unity/Disposable.

Я думал о том, чтобы сохранить объект Bootstrapper в статической переменной и сделать его реализацией IDisposable, но это звучит не так.

ответ

4

Если вы сохраняете ссылку на контейнер в классе Bootstrapper, вы можете утилизировать его на конце приложения.

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(); 
    } 
} 

Или вы можете вернуть контейнер из вашего загрузочного устройства, сохранить ссылку на него и утилизировать его на конце приложения.

public class YourHttpApplication : HttpApplication 
{ 
    private IUnityContainer _container; 

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

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

В зависимости от ваших предпочтений Я думаю. Кроме того, любой из примеров начальной загрузки, перечисленных в вопросе, должен быть хорошим выбором для загрузки вашего приложения.

+0

Почему вы не использовали пакет Bootstrapper и методы из руководства? Это может выглядеть так: 'Bootstrapper.With.Unity(). And.AutoMapper(). And.StartupTasks(). Start();' –

Смежные вопросы