ASP.NET MVC 4에서 Windsor (Castle)로 IoC로 Controller 생성


Visual studio에서 Nuget을 통해 Windsor을 프로젝트에 추가한다.

위 그림은 Online에서 ‘Windsor’로 검색한 결과다.

 

Tip! - Windsor ver 3.1.0 – 2012.08.15

 

정상적으로 References에 참조 등록이 된 것을 확인하고

아래 파일을 추가한다.

 

파일명 : WindsorControllerFactory.cs
(DefaultControllerFactory를 상속받아 Windsor을 이용해 객체를 생성하는 기능을 구현한다)

    public class WindsorControllerFactory : DefaultControllerFactory
    {
        private readonly IKernel kernel;

        public WindsorControllerFactory(IKernel kernel)
        {
            this.kernel = kernel;
        }

        public override void ReleaseController(IController controller)
        {
            kernel.ReleaseComponent(controller);
        }

        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
            }

            return (IController)kernel.Resolve(controllerType);
        }
    }

 

파일명 : ControllersInstaller.cs
(어떤 Assembly에서 어떤 객체를 IoC 해줄지를 등록한다)

    public class ControllersInstaller : IWindsorInstaller
    {

        public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly()
                                        .BasedOn<IController>()
                                        .LifestyleTransient());
        }
    }

 

위의 파일을 만든 다음

Global.asax 파일을 아래와 같이 수정한다.

파일명 : Global.asax.cs
( 컨테이너를 MVC Framework에 끼워 넣는다 )

    public class MvcApplication : System.Web.HttpApplication
    {
        private static IWindsorContainer container;

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

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

            container = new WindsorContainer().Install(FromAssembly.This());

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

 

위와 같이 WindsorControllerFactory를 Global.asax 파일에 연결 시켰으면 이제 실행해 보도록 하자.

 

Ctrl + F5 –> 실행

위와 같이 화면을 정상적으로 보여주고 있다.

 

이제 이 프로젝트는 IoC 컨테이너(Windsor)를 통해 Controller 객체를 생성하여 실행이 되는 구조로 바뀐 것이다.

+ Recent posts