BootStrapper.cs


 

ASP.NET MVC를 실행 할 때 Global.asax 파일에서 일부 설정 파일을 적용토록 하는 작업을 해 보았을 것이다.

ASP.NET MVC 4에서는 기본적으로는 아래와 같이 간소화 되어 Global.asax의 Application_Start()로 만들어 두었다.

파일명 : Global.asax

protected void Application_Start()
{
     AreaRegistration.RegisterAllAreas();

     WebApiConfig.Register(GlobalConfiguration.Configuration);
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     RouteConfig.RegisterRoutes(RouteTable.Routes);
     BundleConfig.RegisterBundles(BundleTable.Bundles);
     AuthConfig.RegisterAuth();

}

위에서 Web API 설정, 필터 설정, 라우트 설정 등등 여러 가지 설정을 MVC Framework에 제공하는 기능으로 대체 하여 MVC의 기본 Configuration을 지정하였다.

그리고 무엇보다 중요한 기능은 외부 라이브러리를 추가하여(DLL 참조) 사용할 때 그 라이브러리의 환경 변수를 개발자가 설정하지 않고 기본 값을 자체적으로 설정하여 Default Behavior를 갖도록 할 수 있다는 것이다.

 

그렇지만 사용자가 임의의 수정하거나 변경을 하기 위해서는 Global.asax파일이 지저분 해지도록 할 수 밖에 없지만

지금 소개하는 WebActivator 라이브러리를 이용하면 파일 구조나 깊이에 상관없이 설정 또는 Business logic을 할 수 있다.

 

이제 본격적으로 소개하도록 하겠다.

“WebAativator”를 Nuget에서 검색하여 프로젝트에 추가한다.

그런 다음 아래와 같이 소스를 추가한다.

파일명 : /App_Start/BootStrapper.cs

( 임의로 BootStrapper.cs로 명명 하였다 )
오른쪽 그림과 같이 파일 추가                                                       

[assembly: WebActivator.PreApplicationStartMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "PreStart")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "PostStart")]
[assembly: WebActivator.ApplicationShutdownMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "Shutdown")]

namespace TDDMVCTest.App_Start
{
    public static class BootStrapper
    {
        private static IWindsorContainer container;

        /// <summary>
        /// 최초 Web Server가 실행 할 때  Application Start가 되기 전에 실행 됨
        /// </summary>
        public static void PreStart() {

            //Business logic or configuration job
            var temp = string.Empty;
        }

        /// <summary>
        /// 최초 Web Server가 실행 되고 나서 Application End가 되고 나서 실행 됨
        /// </summary>
        public static void PostStart()
        {

            //Business logic or configuration job
            var temp = string.Empty;
        }

        /// <summary>
        /// Web Server가 종료되기 전에 실행 됨
        /// </summary>
        public static void Shutdown()
        {

            //Business logic or configuration job
            var temp = string.Empty;
        }
    }
}

위 실행 순서는 IHttpModule 상속하여 구현된 ActivationManager.cs에서 실행을 하며 전체 DLL을 읽어 들여 실행이 되게 하는 구조로 되어 있다.

- 클래스 명이나

- 네임 스페이스가 다름

- 외부 라이브러리로 선언

위와 같아도 Web Server가 실행이 되면 실행이 되는 구조다.

 

Tip !

    WebActivator.ActivationManager.RunPreStartMethods();
    WebActivator.ActivationManager.Run();
    WebActivator.ActivationManager.RunPostStartMethods();
    WebActivator.ActivationManager.RunShutdownMethods();

    위 메소드 실행으로 Activator 단계를 임의로 실행 할 수 있다.

    궁금하면 한번 테스트 해보기 바란다.

 

Tip !

    바로 이전 IoC 컨테이너 속성을 Activator을 이용해 초기화를 할 수도 있을 것이다. 바로 아래에 예시를 달도록 하겠다.

   2013/01/25 - [ASP.NET MVC] - ASP.NET MVC 4에서 Windsor (Castle)로 IoC로 Controller 생성 - 참조


using System;
using System.Web.Mvc;
using TDDMVCTest.Core;
using Castle.Windsor;
using Castle.Windsor.Installer;

[assembly: WebActivator.PreApplicationStartMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "PreStart")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "PostStart")]
[assembly: WebActivator.ApplicationShutdownMethod(typeof(TDDMVCTest.App_Start.BootStrapper), "Shutdown")]

namespace TDDMVCTest.App_Start
{
    public static class BootStrapper
    {
        private static IWindsorContainer container;

        /// <summary>
        /// 최초 Web Server가 실행 할 때  Application Start가 되기 전에 실행 됨
        /// </summary>
        public static void PreStart() {
            container = new WindsorContainer().Install(FromAssembly.This());

            var controllerFactory = new WindsorControllerFactory(container.Kernel);
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);
        }

 

       ……..

    }

}


+ Recent posts