2010-10-02 78 views
7

什么是为我的MVC 2应用程序创建引导程序的最佳方式?我正在使用Unity和AutoMapper,并且想尽可能抽象它们的加载和配置。我应该如何为Unity和AutoMapper实现MVC引导程序?

一个体面的例子在这里(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();' – 2017-02-05 20:07:10